LightOJ 1284 Lights inside 3D Grid

题意是给出一个由边长为1的立方体组成的长方体,每个小立方体中有一盏灯,每次操作随机选择两个立方体,以这两个立方体作为对角线顶点确定一个长方体,长方体中所有块的灯自己取反,就是亮着的关上,暗着的打开,求这样操作k次以后亮着的灯数的期望值。

设F(i)为操作i次以后对某灯奇数次取反的概率,G(i)为偶数次,奇数次取反以后灯是亮着的,贡献的期望值显然是1,所以求出F(k)就可以了。

设p为某灯被选择到的概率。

显然F(i) = F(i - 1) * (1 - p) + G(i - 1) * p, G(i) = 1 - F(i)。联立以后会发现F(k)为等比数列求和的结果。

 

#include <bits/stdc++.h>
using namespace std;

double calc(int aa, int bb) {
    double a = (double)aa, b = (double)bb;
    return 1.0 - ((a - 1.0) * (a - 1.0) + (b - a) * (b - a)) / (b * b);
}

int main() {
    int t;
    scanf("%d", &t);
    int cas = 0;
    while(t--) {
        int x, y, z, n;
        scanf("%d %d %d %d", &x, &y, &z, &n);
        double ans = 0;
        for(int i = 1; i <= x; i++) 
            for(int j = 1; j <= y; j++)
                for(int k = 1; k <= z; k++) {
                    double p = calc(i, x) * calc(j, y) * calc(k, z);
                    ans += 0.5 * (1.0 - pow(1.0 - 2.0 * p, (double)n));
                }
        printf("Case %d: %.7lf\n", ++cas, ans);
    }
}

 

posted @ 2016-08-07 16:17  MartinEden  阅读(176)  评论(0编辑  收藏  举报