http://acm.hdu.edu.cn/showproblem.php?pid=5245
题目大意:一个大矩形由n*m个小方块组成,一个人每次选两个小方块,他可以对以这两个方块为顶点的矩形面积内的小方块上色,他一共可选k次,现在求被上色的小方块数目的期望
在做这道题的时候能考虑到是期望概率的问题,但是怎么算也得不到样例,看完题解后才明白,欠缺。
借鉴的题解:
每个格子可以被重复选,因此可以把每一个小方块选不选当做一个独立事件,所以我们算出每个小方块对总期望的贡献值就行了,直接算不好算,考虑算每个小方块一次不被选的概率p,这个算起来就方便很多,不妨以当前点为中心,那么只有四种情况,被选的两个小方块同在中心的上下左右,不过这样会重复,四个角相当于被算了两次,再把它们减掉一次,这样求出来的是当前点一次不会被上色的情况数,除以总情况数(m * n * m * n)就是当前方块一次不会被上色的概率,再乘k次,就是k次这个方块都不被上色的概率,用1减则为选k次这个方块被上色的概率,只需要把每个方块选k次后被上色的概率累加即可,情况数中间可能会爆int,用__int64
此代码在杭电提交C++超时用G++则AC
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int main()
{
__int64 t,i,j,cas,ii,n,m,k;
double sum,num;
scanf("%I64d",&t);
{
for(ii=1;ii<=t;ii++)
{
scanf("%I64d%I64d%I64d",&m,&n,&k);
sum=num=0;
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
num+=(i-1)*n*(i-1)*n;
num+=(j-1)*m*(j-1)*m;
num+=(m-i)*n*(m-i)*n;
num+=(n-j)*m*(n-j)*m;
num-=(i-1)*(j-1)*(i-1)*(j-1);
num-=(i-1)*(n-j)*(i-1)*(n-j);
num-=(m-i)*(j-1)*(m-i)*(j-1);
num-=(m-i)*(n-j)*(m-i)*(n-j);
num/=n*m*n*m;
sum+=1.0-pow(num,k);
}
}
printf("Case #%I64d: %.0lf\n",ii,sum);
}
}
return 0 ;
}