zoukankan      html  css  js  c++  java
  • 问题 : 谷神的*游戏(数学思维+排列组合)

    题目描述

    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 }
  • 相关阅读:
    [Linux] Chmod 改变权限
    [linux命令]基本命令
    [Linux命令] 查看目录大小du
    [Linux命令]格式化mkfs
    在VMWare下的Linux切换
    .net的MSMQ异步调用
    CASSINI源代码分析
    [Wix] RadioButton与ListItem的属性要改掉了
    如何快速生成Insert数据插入语句?
    撕纸
  • 原文地址:https://www.cnblogs.com/wenzhixin/p/8871844.html
Copyright © 2011-2022 走看看