题意是给出一个由边长为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 ", ++cas, ans); } }