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));
    }

}

猜你喜欢

转载自www.cnblogs.com/dongdong25800/p/10811768.html