http://acm.hdu.edu.cn/showproblem.php?pid=5245
题意:
给出一个n*m的矩阵格子,现在有k次操作,每次操作随机选择两个格子作为矩形的对角,然后将这范围内的格子填色,现在要求经过k次操作后填色格子的期望值。
思路:
给个格子都是独立的,所以只需要计算出每个格子经过k次操作后被填色的概率即可,最后所有格子相加就是期望值。但是直接求填色概率不好求,求不被填色概率会比较容易。假设一次操作的不被填色概率为p,那么k次之后的概率为p^k,最后该格子填色概率就是1-p^k。
如图所示,假设我们现在要求(i,j)这个格子的不被填色概率,那么我们可以选择的两个格子可以是上部,左部,右部和下部,但是这样的话对角的四个矩形区域重复计算了一次,所以需要减去。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 typedef long long ll; 7 int m,n,k; 8 9 int main() 10 { 11 //freopen("in.txt","r",stdin); 12 int T; 13 scanf("%d",&T); 14 int cas = 1; 15 while(T--) 16 { 17 scanf("%d%d%d",&n,&m,&k); 18 double ans = 0; 19 double sum = (ll)m*n*m*n; 20 for(ll i=1;i<=n;i++) 21 { 22 for(ll j=1;j<=m;j++) 23 { 24 ll num = 0; 25 num += (i-1)*m*(i-1)*m; //上 26 num += (n-i)*m*(n-i)*m; //下 27 num += (j-1)*n*(j-1)*n; //左 28 num += (m-j)*n*(m-j)*n; //右 29 num -= (i-1)*(j-1)*(i-1)*(j-1); 30 num -= (i-1)*(m-j)*(i-1)*(m-j); 31 num -= (n-i)*(j-1)*(n-i)*(j-1); 32 num -= (n-i)*(m-j)*(n-i)*(m-j); 33 ans += 1 - pow(num/sum, k); 34 } 35 } 36 int a = round(ans); 37 printf("Case #%d: %d ",cas++, a); 38 } 39 return 0; 40 }