和那天网络赛很相似,倒着推,这是二维的情况。注意提交别用G++,真坑啊。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #define eps 1e-9 6 using namespace std; 7 double p[1005][1005]; 8 int main() 9 { 10 int n,m,i,j; 11 while(scanf("%d%d",&n,&m)!=EOF) 12 { 13 memset(p,0,sizeof(p)); 14 for(i = n-1; i >= 0; i --) 15 { 16 p[i][m] = p[i+1][m] + n*1.0/(n-i); 17 } 18 for(i = m-1; i >= 0; i --) 19 { 20 p[n][i] = p[n][i+1] + m*1.0/(m-i); 21 } 22 for(i = n-1; i >= 0; i --) 23 { 24 for(j = m-1; j >= 0; j --) 25 { 26 p[i][j] = (1.0/(n*m-i*j))*((n-i)*j*p[i+1][j]+(n-i)*(m-j)*p[i+1][j+1]+i*(m-j)*p[i][j+1]+n*m); 27 } 28 } 29 /*for(i = n;i >= 0;i --) 30 { 31 for(j = m;j >= 0;j --) 32 printf("%.2lf ",p[i][j]); 33 printf("\n"); 34 }*/ 35 printf("%.4lf\n",p[0][0]+eps); 36 } 37 return 0; 38 }