题目链接:
J - Joyful
题目大意:给你一个n*m的矩阵,然后你有k次涂色机会,然后每一次可以选定当前矩阵的一个子矩阵染色,问你这k次用完之后颜色个数的期望。
具体思路:颜色个数的期望等于每一个方块单独的期望加起来,就是总的期望。
对于当前的方块的期望,我们先计算这个方块不会出现的概率,就是当前的(x,y),先计算出当前的两个点在他周围四整块的出现的概率,但是这样四个角会重复计算,再去掉就好了。
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 # define ll long long
4 const int maxn = 2e5+100;
5 int main()
6 {
7 int T;
8 int Case=0;
9 scanf("%d",&T);
10 while(T--)
11 {
12 ll n,m,k;
13 scanf("%lld %lld %lld",&n,&m,&k);
14 double sum=0;
15 for(ll i=1; i<=n; i++)
16 {
17 for(ll j=1; j<=m; j++)
18 {
19 ll tmp=0;
20 tmp+=(ll)(i-1ll)*m*(i-1ll)*m;
21 tmp+=(ll)(j-1ll)*n*(j-1ll)*n;
22 tmp+=(ll)(n-i)*m*(n-i)*m;
23 tmp+=(ll)(m-j)*n*(m-j)*n;
24
25 tmp-=(ll)(i-1ll)*(j-1ll)*(i-1ll)*(j-1ll);
26 tmp-=(ll)(n-i)*(j-1ll)*(n-i)*(j-1ll);
27 tmp-=(ll)(i-1ll)*(m-j)*(i-1ll)*(m-j);
28 tmp-=(ll)(n-i)*(m-j)*(n-i)*(m-j);
29 double ans=(tmp*1.0)/(n*n*m*m);
30 ans=pow(ans,k);
31 sum+=1.0-ans;
32 }
33 }
34 ll tmp=round(sum);
35 printf("Case #%d: %d
",++Case,tmp);
36 }
37 return 0;
38 }