题解:
本题主要思路是,算出i个人的总选择数a和以悲剧结尾的总选择数b,然后b/a,完成。属于递推题:
图中横杠代表人,竖杠代表签名。Ai代表i个人共有A[i]个选择,Bi起过度作用。因为最多有20人,可将这20个数据存储到数组中以备调用。
这样很容易得到递推式:B[i] = A[i-2] + (n-2) * B[i-1], A[i] = (i-1) * B[i];
代码如下:
#include <stdio.h>__int64 fact(int n)
{__int64 ft = n;while (--n){ft *= n;}return ft;
}int main()
{__int64 A[21] = {0, 0, 1}, B[21] = {0, 0, 1}, ft[21] = {1, 1, 2};int n, i, t;double perc;for (i=3; i<=20; i++){B[i] = A[i-2] + (i - 2) * B[i-1];A[i] = (i - 1) * B[i];ft[i] = fact(i);}scanf("%d", &n);while (n--){scanf("%d", &t);perc = A[t]*100.0/ft[t];printf("%.2lf%%\n", perc);}return 0;
}