题目链接:
J - Joyful
题目大意:给你一个n*m的矩阵,然后你有k次涂色机会,然后每一次可以选定当前矩阵的一个子矩阵染色,问你这k次用完之后颜色个数的期望。
具体思路:颜色个数的期望等于每一个方块单独的期望加起来,就是总的期望。
对于当前的方块的期望,我们先计算这个方块不会出现的概率,就是当前的(x,y),先计算出当前的两个点在他周围四整块的出现的概率,但是这样四个角会重复计算,再去掉就好了。
AC代码:
#include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn = 2e5+;
int main()
{
int T;
int Case=;
scanf("%d",&T);
while(T--)
{
ll n,m,k;
scanf("%lld %lld %lld",&n,&m,&k);
double sum=;
for(ll i=; i<=n; i++)
{
for(ll j=; j<=m; j++)
{
ll tmp=;
tmp+=(ll)(i-1ll)*m*(i-1ll)*m;
tmp+=(ll)(j-1ll)*n*(j-1ll)*n;
tmp+=(ll)(n-i)*m*(n-i)*m;
tmp+=(ll)(m-j)*n*(m-j)*n; tmp-=(ll)(i-1ll)*(j-1ll)*(i-1ll)*(j-1ll);
tmp-=(ll)(n-i)*(j-1ll)*(n-i)*(j-1ll);
tmp-=(ll)(i-1ll)*(m-j)*(i-1ll)*(m-j);
tmp-=(ll)(n-i)*(m-j)*(n-i)*(m-j);
double ans=(tmp*1.0)/(n*n*m*m);
ans=pow(ans,k);
sum+=1.0-ans;
}
}
ll tmp=round(sum);
printf("Case #%d: %d\n",++Case,tmp);
}
return ;
}