LightOJ 1284 Lights inside 3D Grid(概率)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1284

题意: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 <stdio.h>

#include <math.h>

 

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;

}

  

你可能感兴趣的:(grid)