题目描述
NEUQ 的谷神要和我赌一个游戏:谷神要求我随机在纸上写出整数集合{1,2,3,...,3n+1} (n 是整数)的一个排列(即不重复的随机写出从 1 到 3n+1 的所有整数)。并且要求在我写的过程中,从我写的第一个数开始一直加到我正在写的数的总和不被 3 整除。如果我能写出来符合要求的一个排列,那么我就赢得游戏。那么问题来了,我赢得游戏的概率是多少?
输入
一组测试数据,第一行输入测试样例的数目 k,接下来 k 行每行一个正整数 n 代表一个样例(1<=n<=15)。
输出
对于每个样例数据依次输出我赢得比赛的概率(结果保留小数点后 9 位有效数字)。
样例输入
1
1
样例输出
0.250000000
提示
例如 n=1,则谷神要求我随机写 1 到 4 的排列,如果我按顺序写 1 3 4 2 则是合法的,因为 1,1+3、1+3+4、1+3+4+2 都不被 3 整除。如果我按顺序写 1 2 3 4 则是不合法的,因为当我写到 2 的时候 1+2=3 可以被 3 整除,不符合游戏规定。
1 /* 2 问题 给出n(1<=n<=15),写出1到3*n+1的排列时,当前的前缀和不能被三整除,问所有成功的概率是多大 3 4 解题思路 刚开始想用暴力模拟来做,发现要计算46!,看了题解才知道,需要将1到3*n+1这3*n+1个数分成三个集合,分别是对三取模为0, 5 个数为n, 对三取模为1,个数为n+1,对三取模为2,个数为n。排列这3*n+1个数的时候,考虑第一位不能放0这个集合里的,直接被三 6 整除了,所以再看放2这个集合里的数,会发现后面的位置只能放2集合里的数,因为只要放一个1就能被三整除了。 7 所以只能以1集合里的数开头,故排列为112121212... 8 可以发现,总共3*n+1个数,0可以摆放的位置是除了首位剩下的3*n个位置,那么有A(3n,n)中排列方法 9 1可以摆放的方法有A(n+1,n+1) 10 2可以摆放的方法有A(n,n) 11 总共有A(3*n+1,3*n+1)种可能 12 故概率公式为 13 A(3n,n)* A(n+1,n+1)* A(n,n)/ A(3*n+1,3*n+1) 14 展开化简可得 15 n!/((2*n*...(n+2) * (3*n+1)) 16 */ 17 #include<cstdio> 18 19 int main() 20 { 21 int n,t,i; 22 double ans; 23 scanf("%d",&t); 24 while(t--){ 25 scanf("%d",&n); 26 ans=1; 27 for(i=1;i<=n;i++){ 28 ans *= i; 29 } 30 for(i=n+2;i<=2*n;i++){ 31 ans /= i; 32 } 33 ans /= 3*n+1; 34 printf("%.9lf ",ans); 35 } 36 return 0; 37 }