HDU - 5245 Joyful(数学期望)

题意:给定一个n*m(n,m <= 500)的方格进行K(K <= 20)次染色,每次染色会随机选取一个以(x1,y1),(x2,y2)为一组对角的子矩阵进行染色,求K次染色后染色面积的期望值(四舍五入)。

思路:设随机一次方格(i,j)被染色的概率为p,不被染色的概率为(1 - p),方格(i,j)在k次中被染色为在k次中没有被染色的逆事件,故方格(i,j)被染色的概率为1 - (1 - p)^k。

求方格(i,j)一次被染色的概率,可以将整个方格分为9块区域,5为(i,j)。

1

2

3

4

5

6

7

8

9

第一次选的点位置有九种, 然后分别求出对应的第二个点的种数。然后除以总种数n*n*m*m。

#include <cstdio>
#include <algorithm>
#include <iostream>
#include<vector>
#include<cmath>
#include<set>
#include<cstring>
#include<sstream>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 1299709 + 10;
const int maxt = 100200;
const int inf = 0x3f3f3f3f;
const ll INF = 0x7f7f7f7f7f7f7f7f;
const int mod = 1e9 + 7;
const double pi = acos(-1.0);
const double eps = 1e-8;
int n, m, k;
ll cal(int x, int y){ //计算一个格子被选中的次数
    ll c1 = (x - 1) * (y - 1), c2 = x - 1, c3 = (x - 1) * (m - y), c4 =  y - 1, c5 = 1, c6 = m - y, c7 =  (y - 1) * (n - x), c8 = n - x, c9 =(n - x) * (m - y); // 第一个格子有九种情况
    ll d1 = (n - x + 1) * (m - y + 1), d2 =  m * (n - x + 1), d3 = (n - x + 1) * y, d4 =  n * (m - y + 1), d5 = n * m, d6 =  n * y, d7 = (m - y + 1) * x, d8 = m * x, d9 = x * y; // 对应的第二个格子的情况
    return (c1 * d1 + c2 * d2 + c3 * d3 + c4 * d4 + c5 * d5 + c6 * d6 + c7 * d7 + c8 * d8 + c9 * d9);
}
int main(){
    int T, kase = 0;
    scanf("%d", &T);
    while(T--){
        scanf("%d%d%d", &n, &m, &k);
        ll sum = (ll)n * m * n * m; // 总的情况
        double ans = 0;
        for(int i = 1; i <= n; ++i){
            for(int j = 1; j <= m; ++j){
                double p = (double)cal(i, j) / sum;
                ans += 1 - pow(1 - p, k);
            }
        }
        printf("Case #%d: %d\n", ++kase, (int)(ans + 0.5));
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值