Time Limit: 2000MS | Memory Limit: 65536K | |||
Total Submissions: 8800 | Accepted: 2306 | Special Judge |
Description
Input
Output
Sample Input
5 100 2 0
Sample Output
0.625
Source
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 8 int c,n,m; 9 double dp[2][10003]; 10 11 int main() 12 { 13 // freopen("in.txt","r",stdin); 14 while(~scanf("%d",&c)){ 15 if(c==0) break; 16 scanf("%d%d",&n,&m); 17 memset(dp,0,sizeof(dp)); 18 if(m>n||m>c||(m+n)%2){//奇偶剪枝 19 printf("0.000\n"); 20 continue; 21 } 22 if(n>1000) 23 { 24 n=1000+n%2; 25 }//1000以上都转化为1000或1001计算,因为只保留三位小数 26 dp[0][0]=1.0;dp[1][1]=1.0; 27 for(int i=2;i<=n;i++) 28 { 29 dp[i&1][0]=(dp[(i-1)&1][1])*1.0/c; 30 dp[i&1][c]=(dp[(i-1)&1][c-1])*1.0/c; 31 for(int j=1;j<=i&&j<=c;j++) 32 { 33 dp[i&1][j]=dp[(i-1)&1][j-1]*(c-j+1)*1.0/c+dp[(i-1)&1][j+1]*(j+1.0)/c; 34 } 35 } 36 printf("%.3lf\n",dp[n&1][m]); 37 } 38 return 0; 39 }
原文:http://www.cnblogs.com/codeyuan/p/4279461.html