题目链接:
题意:X*Y*Z。每个位置(x,y,z)有一盏灯,初始时是灭的。K轮操作。每轮任意选两盏灯(可以相同)将其之间的所有灯翻转。问最后明着的灯的数量期望。
思路:先求出每盏灯在一轮中被改变的概率,对于(i,j,k)位置的,只要选择的两盏灯不在同一侧就行。那么可以对于每一维分别算,比如对于X这一维,就是减去在其同侧的。然后计算K轮被改变奇数次的概率就是该盏灯最后对答案的贡献。这f(n)表示n次改变奇数次,g(n)表示偶数次,则有f(n)=f(n-1)*(1-p)+g(n-1)*p,然后g(n)=1-f(n)得到:f(n)=f(n-1)*(1-2p)+p,最后得到f(n)=(1-(1-2p)^n)/2。
#include#include int x,y,z,K;int C,num=0; double get(int a,int b){ return 1.0*b*b-(a-1)*(a-1)-(b-a)*(b-a);} int main(){ for(scanf("%d",&C);C--;) { scanf("%d%d%d%d",&x,&y,&z,&K); printf("Case %d: ",++num); double ans=0,p,t=1.0*x*x*y*y*z*z; int i,j,k; for(i=1;i<=x;i++) for(j=1;j<=y;j++) for(k=1;k<=z;k++) { p=1.0*get(i,x)*get(j,y)*get(k,z)/t; ans+=0.5-0.5*pow(1-p-p,1.0*K); } printf("%.8lf\n",ans); } return 0;}