Description

有一个由M个整数组成的序列,每次从中随机取一个数(序列中每个数被选到的概率是相等的)累加,一共取N次,最后结果能被3整除的概率是多少?

Input

输入包含多组数据。
    对于每组测试数据,第一行包含两个整数M, N (1 <= M <= 100, 1 <= N <= 30),含义同上。接下来一行包含M个在[1, 100]范围内整数,依次描述了这个序列中的各个整数。

Output

对于每组数据,用“Case X: Y”的格式输出答案,其中X表示是第几组测试数据(从1开始),Y表示最后结果能被3整除的概率,四舍五入保留8位小数。

Sample Input

  1. 2 2
  2. 1 2
  3. 1 2
  4. 4
  5. 1 3
  6. 4
  7. 5 10
  8. 4 5 3 1 5

Sample Output

  1. Case 1: 0.50000000
  2. Case 2: 0.00000000
  3. Case 3: 1.00000000
  4. Case 4: 0.33333340

Hint

这个题目主要是想推荐大家用“double”处理浮点数,而尽量不要用“float”,因为“float”的精度偏低,往往不能满足题目的精度要求,所以在ACM竞赛中索性可以直接使用“double”去处理浮点数问题。“double”用“%lf”控制读入,“%f”控制输出。
    我们先解决一下其他的细节问题再来讨论这个题的思路。
    首先,这个题目也是有多组数据的,但不像“A Sample Problem”那样直接给出了数据的组数,那么要怎么处理呢?这时我们一般采用类似while(scanf(“%d%d”, &M, &N) != EOF){}这样的代码来处理,“!= EOF”是关键,至于他的具体含义就不过多介绍了,总之有了这个框架之后,我们直接在while循环里面写我们处理每组数据的代码就可以了。这时你可能会有这样的疑问:如果这么写代码的话,那么我在手动输入样例的时候怎么才算结束输入呢?Ctrl + Z,然后回车就OK了!
    其次,保留8位小数怎么处理呢?一般在ACM竞赛里面,如果没有明确说明具体怎么处理(比如要用“去尾法”),或者说让“四舍五入”,我们都采用类似printf(“%.8f”, x)的形式保留指定位数的小数。至于使用C++中的cout输出的同学,请自己查阅控制小数位数的相关资料。
    接下来我们就分析这个题目怎么做吧。
    首先,最后能不能被3整除,实际上和最后取出的整数之和(不妨记这个和为“S”)模3的结果有关系。所谓的“模”就是C/C++中的运算符“%”,就是“除以某个数取余”的意思。如果S%3==0,那么就是能被3整除,如果S%3==1或者S%3==2,那么就不能被3整除。也就是说我们要计算的就是S%3==0的概率。

 我们不妨分析一下第四个样例。取十次有点多,我们先取一次看看。
    取一次的话,模3得0的数只有3,所以S%3==0的概率就是0.2(记这个概率为p0),模3得1的数有两个:4和1,所以S%3==1的概率就是0.4(记这个概率为p1),同样的,模3得2的数有两个:5和5,所以S%3==2的概率也是0.4(记这个概率为p2)。
    再分析一下取两次的情况?
    取两次的话S%3==0的概率要怎么算呢?p0*p0 + p1*p2 + p2*p1 = 0.36。这么算的含义是什么呢?因为要保证最后S%3==0,那么如果第一次取出的数模3得0的话,第二次取的数必须也是模3得0,同样的,如果第一次取出的数模3得1的话,那么第二次取出的数必须是模3得2,如果第一次取出的数模3得2的话,那么第二次取出的数必须模3得1。这样我们就得到了上面的式子。同理,我们可以计算S%3==1的概率为p0*p1 + p1*p0 + p2*p2 = 0.32,S%3==2的概率也是0.32。
    再分析一下取三次的情况?
    取三次的话S%3==0的概率应当是0.36*p0 + 0.32*p2 + 0.32*p1。这么算的意义想必大家已经想到了,因为我们要保证最后S%3==0,那么如果前两次取出的数之和模3得0的话,那么第三次取出的数必须也是模3得0,同样的,如果前两次取出的数之和模3得1的话,那么第三次取出的数必须是模3得2,如果前两次取出的数之和模3得2的话,那么第三次取出的数必须是模3得1。同理,我们也很容易写出S%3==1以及S%3==2的概率要怎么算。
    分析到这里想必大家应该已经想到第四次,第五次,一直到第十次要怎么计算了吧?用类似的办法,根据第三次的结果就可以计算出第四次的结果,根据第四次的结果就可以算出第五次的,等等。这样即使一直算到一百次也不成问题!for循环100次就OK了。

  1. #include<stdio.h>
  2. double p[][];
  3.  
  4. int main()
  5. {
  6. int m,n,x,t=;
  7.  
  8. while(scanf("%d%d",&m,&n)!=EOF)
  9. {
  10. p[][]=p[][]=p[][]=;
  11.  
  12. for(int i=;i<m;i++)
  13. {
  14. scanf("%d",&x);
  15. p[][x%]+=;
  16. }
  17. p[][]/=m;
  18. p[][]/=m;
  19. p[][]/=m;
  20. for(int i=;i<=n;i++)
  21. {
  22. p[i][]=p[i-][]*p[][]+p[i-][]*p[][]+p[i-][]*p[][];
  23. p[i][]=p[i-][]*p[][]+p[i-][]*p[][]+p[i-][]*p[][];
  24. p[i][]=p[i-][]*p[][]+p[i-][]*p[][]+p[i-][]*p[][];
  25. }
  26. printf("Case %d: %.8f\n",++t,p[n][]);
  27. }
  28. return ;
  29. }

csu oj 1342: Double的更多相关文章

  1. csu oj 1339: 最后一滴血

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1339 1339: 最后一滴血 Time Limit: 1 Sec  Memory Limit: 1 ...

  2. csu oj 1330 字符识别?

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1330 1330: 字符识别? Time Limit: 1 Sec  Memory Limit: 1 ...

  3. csu oj 1811: Tree Intersection (启发式合并)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1811 给你一棵树,每个节点有一个颜色.问删除一条边形成两棵子树,两棵子树有多少种颜色是有 ...

  4. csu oj 1804: 有向无环图 (dfs回溯)

    题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1804 中文题意就不说了. dfs从底到根回溯即可,看代码应该能清楚. //#pragma ...

  5. csu oj 1344: Special Judge

    Description Given a positive integer n, find two non-negative integers a, b such that a2 + b2 = n. I ...

  6. csu oj 1343 Long Long

    Description 现在有两个单调递增序列,第一个序列有N个整数,第二个序列有M个整数,现在你可以从第一个序列中选一个数x,然后从第二个序列中选一个数y,那么有多少种情况满足x+y<=K呢? ...

  7. csu oj 1341 string and arrays

    Description 有一个N*N的字符矩阵,从上到下依次记为第1行,第2行,……,第N行,从左至右依次记为第1列,第2列,……,第N列. 对于这个矩阵会进行一系列操作,但这些操作只有两类: (1) ...

  8. CSU OJ 1340 A Sample Problem

    Description My girlfriend loves 7 very much, she thinks it is lucky! If an integer contains one or m ...

  9. 九度OJ 1342:寻找最长合法括号序列II (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:898 解决:366 题目描述: 假如给你一个由'('和')'组成的一个随机的括号序列,当然,这个括号序列肯定不能保证是左右括号匹配的,所以给 ...

随机推荐

  1. P2221 [HAOI2012]高速公路

    思路 考虑每一条边的贡献,然后推式子 \[ \begin{align}&\sum_{i}V_i\times(R-i+1)\times(i-L+1)\\=&\sum_{i}V_i\lef ...

  2. Codeforces 855C. Helga Hufflepuff's Cup----树形DP

    z最近在学习树形DP...好难啊. 在cf上找到了一题c题当模版马克一下. 题目不贴了..>>http://codeforces.com/problemset/problem/855/C& ...

  3. 解决 Boost安装:fatal error: bzlib.h: No such file or directory 问题

    参考: How to install all the boost development libraries? 解决 Boost安装:fatal error: bzlib.h: No such fil ...

  4. 利用React Native 从0到1 开发一款兼容IOS和android的APP(仿造京东)

    最近有一部电视剧叫做<微微一笑很傻逼>里面有个男猪脚,人们都叫他大神~我觉得吧~大神是相对的~所以~啥事都得谦虚! 好了 今天介绍的是如何从0到1利用React Native开发一款兼容I ...

  5. 宠物属性控制_pet

    classIndex 职业索引 DmgAddPct 根据职业的法伤或攻强来计算宠物增加的物理伤害,增加的伤害值等于玩家法伤或攻强的百分比 SpAddPct 根据职业的法伤或攻强来计算宠物增加的法术伤害 ...

  6. linux使用技巧,返回上一次目录

    cd - 当你一不小心,走岔了的时候,可以通过这个命令,直接找回上一次的路径.

  7. isnull和sum的关系

    这是我刚刚写存储过程的时候意识到的一个问题!!! 先问大家这样一个问题,print 100+null  等于多少? 在一组数据统计的过程中,只要使用到sum函数,就必须使用isnull函数包含起来,因 ...

  8. SQL server2008安装与管理

    1.1  启动SQL server的三种形式 后台启动:计算机->右键->管理->->服务和应用程序->服务->sql server(***) Sql server ...

  9. ace后台管理系统扁平化框架

    Bootstrap ACE后台管理界面模板(扁平化) 所属分类:后台模板 文件大小:1.22 MB 阅读:236697次 下载:55929次 来源:www.daimajiayuan.com 分享到:更 ...

  10. PHP加密函数

    单向散列加密 单向散列加密是指通过对不同输入长度的信息进行散列计算,得到固定长度的输出.这个散列计算是单向的,即不能对固定长度的输出进行计算从而获取输入信息. 特征:雪崩效应.定长输出和不可逆 作用: ...