NC52278. 取球游戏
描述
小sun非常喜欢玩游戏,最近他和同学正在玩这样一个游戏:
小sun有一个神奇的袋子,袋子里面有C种颜色的球,每种颜色的球都有无限多个。现在小sun每次将会从袋子里拿出一个球,然后将这个球放在桌面上,如果桌面上已经有这种颜色的球了,小孙就把它们两个重新放进袋子里。
在玩的时候小sun想到了一个问题,他想问问你:在第n次拿球后,桌上有m种颜色的球的概率是多少?
输入描述
输入一行:c,n,m代表的含义如题中所述。
输出描述
输出一行答案,保留3位小数
示例1
输入:
100 100000 50
输出:
0.159
C++14(g++5.4) 解法, 执行用时: 18ms, 内存消耗: 10212K, 提交时间: 2019-09-18 11:02:42
#include<iostream> using namespace std; double dp[100010][123]; int main() { long long c,n,m; cin>>c>>n>>m; if(n>10000) n=10000+(n&1); dp[0][0]=1.0; for(int i=1;i<=n;i++) { for(int j=0;j<=c;j++) { if(j) dp[i][j]=dp[i][j]+dp[i-1][j-1]*(c-j+1)/(c*1.0); dp[i][j]=dp[i][j]+dp[i-1][j+1]*(j+1)/(c*1.0); } } printf("%.3lf\n",dp[n][m]); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 5ms, 内存消耗: 1256K, 提交时间: 2019-09-13 22:14:18
#include<bits/stdc++.h> using namespace std; long long c,n,m; double f[1005][101]; int main(){ cin>>c>>n>>m; f[0][0]=1.0; if(n>=950)n=1000+(n&1); for(int i=1;i<=n;i++) for(int j=0;j<=i&&j<=c;j++){ f[i][j]=1.0*f[i-1][j+1]*(j+1)/c; if(j)f[i][j]+=1.0*f[i-1][j-1]*(1.0-(double)(j-1)/c); } printf("%.3f",f[n][m]); }
C++(g++ 7.5.0) 解法, 执行用时: 4ms, 内存消耗: 1208K, 提交时间: 2022-11-09 21:14:16
#include<iostream> using namespace std; long long c,n,m; double f[1005][101]; int main(){ cin>>c>>n>>m; f[0][0]=1.0; if(n>=950)n=1000+(n&1); for(int i=1;i<=n;i++) for(int j=0;j<=i&&j<=c;j++){ f[i][j]=1.0*f[i-1][j+1]*(j+1)/c; if(j)f[i][j]+=1.0*f[i-1][j-1]*(1.0-(double)(j-1)/c); } printf("%.3f",f[n][m]); }