2100年,ACM牌巧克力将风靡全球。

“绿的,橘红的,棕色的,红的…”,彩色的糖衣可能是ACM巧克力最吸引人的地方。你一共见过多少种颜色?现在,据说ACM公司从一个24种颜色的调色板中选择颜色来装饰他们的美味巧克力。

有一天,Sandy用一大包有五种颜色的巧克力玩了一个游戏。每次他从包里拿出一粒巧克力并把它放在桌上。如果有桌上有两粒相同颜色的巧克力,他就把他们吃掉。他惊奇的发现大多数时候桌上都有2到3粒巧克力。

如果ACM巧克力有C(1≤C≤100)种颜色,在拿出了N(1≤N≤1000000)粒巧克力之后在桌上恰有M(1≤M≤1000000)粒的概率是多少?

/*
转移方程很好想,f[i][j]表示取了i个恰好有j个在桌子上的概率
f[i][j]=f[i-1][j+1]*(j+1)/c+f[i-1][j-1]*(j+1)/c
但是这道题的n特别大,所以考虑一种神奇的方法。
由于本题对精度的要求不高,而且越到后面,它与前面的相差并不大,所以我们可以只求一部分。
需要注意的是,当n+m是奇数时,概率一定是0,所以要奇偶划分。
*/
#include<cstdio>
#include<iostream>
#include<cstring>
#define N 1010
using namespace std;
double dp[N][N];int c,n,m;
int main(){
freopen("jh.in","r",stdin);
while(scanf("%d",&c)&&c){
memset(dp,,sizeof(dp));
scanf("%d%d",&n,&m);
if(!n&&!m){
printf("1.000\n");
continue;
}
if(m>c||m>n||(m+n&)){
printf("0.000\n");
continue;
}
if(n>){
if(n&) n=;
else n=;
}
dp[][]=;
for(int i=;i<=n;i++)
for(int j=;j<=min(i,c);j++){
if(i+j&) {dp[i][j]=;continue;}
if(j>) dp[i][j]+=dp[i-][j-]*double(c-j+)/double(c);
if(j+<i) dp[i][j]+=dp[i-][j+]*double(j+)/double(c);
}
printf("%.3lf\n",dp[n][m]);
}
return ;
}

最新文章

  1. int类型的正负数转换
  2. 查看Linux内存状况的命令及工具
  3. angularjs 延迟更新和angularjsUI
  4. DNS原理及其解析过程【精彩剖析】(转)
  5. careercup-中等难度 17.11
  6. gdb零散学习心得。
  7. python and 和 or
  8. 首先运行application的name相应的类或做activity中间name相应的类?
  9. Java 中的四种引用及垃圾回收策略
  10. Asp.Net MVC-4-过滤器1:认证与授权
  11. Ruby学习之元编程
  12. building a new horizon
  13. 测试Oracle统计信息的导出导入
  14. Android中asset文件夹和raw文件夹区别与用法
  15. 组委会正在为美团点评CodeM大赛的决赛设计新赛制
  16. oracle 11g wm_concat 、 listagg 函数的使用(合并数据)
  17. linux分享一:网络设置
  18. Web端主流框架,jquery、angular、react、vue
  19. java中static关键字的使用
  20. sklearn中的随机森林

热门文章

  1. javaweb基础(16)_jsp指令
  2. java基础——Map集合
  3. ios下通过webservice获取数据
  4. C#:CodeSmith根据数据库中的表创建C#数据模型Model + 因为没有钱买正版,所以附加自己写的小代码
  5. 快速启动mongodb服务
  6. pre-commit钩子,代码质量检查
  7. python爬虫基础15-python图像处理,PIL库
  8. 中国电信物联网平台入门学习笔记2: DOME程序分析
  9. pandas-Notes1
  10. freertos知识点笔记——队列、二值信号量、计数信号量