问题 : 谷神的赌博游戏(数学思维+排列组合)

题目描述

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\n",ans);
35     }
36     return 0;
37 }

 

posted @ 2018-04-18 09:05  Reqaw  阅读(341)  评论(0编辑  收藏  举报