J - Joyful -数学期望
J - Joyful
题意:给你一个n*m的矩形,每次你可以其中挑选任意两个点作为一个矩形的对角,然后将矩形区域染色,现在告诉你要操作k次,求矩形中有多少个小方格被染色的期望值。
做法:线性期望?E(X+Y)=E(X)+E(Y),我们将问题转化为每个小方格被染色的期望值,然后累加就是总的期望值,对于求每个小方格被染色的期望值我们可以求它被染色的概率p,反向求它不被染色的概率会很容易,可知对于一个小方格总次数是m*m*n*n,不被染色的区域就是两个点都在小方格的上,下,左,右,然后对于四个角会多算一次,最后减一下。
注意事项!!!!:在写代码时,要时刻注意对于int计算时,避免溢出要先强转(long long),时刻注意int计算结果转化double时要在计算前加1.0*或1.0+使它先变成浮点数在运算。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
int main()
{
int t,n,m,k;
scanf("%d",&t);
for(int it=1; it<=t; it++)
{
scanf("%d%d%d",&n,&m,&k);
LL sum=(LL)n*n*m*m;
double ans=0;
LL cnt=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
cnt=0;
cnt+=(LL)(i-1)*(i-1)*m*m;
cnt+=(LL)(n-i)*(n-i)*m*m;
cnt+=(LL)(j-1)*(j-1)*n*n;
cnt+=(LL)(m-j)*(m-j)*n*n;
cnt-=(LL)(i-1)*(i-1)*(j-1)*(j-1);
cnt-=(LL)(i-1)*(i-1)*(m-j)*(m-j);
cnt-=(LL)(n-i)*(n-i)*(j-1)*(j-1);
cnt-=(LL)(n-i)*(n-i)*(m-j)*(m-j);
double temp=1.0*cnt/sum;
ans+=1.0-pow(temp,k);
}
// printf("%lf\n",ans);
printf("Case #%d: %d\n",it,(int)(ans+0.5));
}
}