题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754
题意:有3个筛子,分别有k1,k2,k3个面。每次掷筛子,如果三个面为指定的a,b,c,则分数置0,否则分数加上三个筛子的和。当总分大于n时结束。求游戏结束掷筛子次数的期望。
思路:E[i]=sum(E[i+k]*Pk)+E[0]*P0+1(E[i]表示当前分数为i到达结束的期望,Pi表示一次掷筛子得到i的概率)。那么答案就是E[0]。设E[i]=A[i]*E[0]+B[i],带入得到:E[i]=sum(A[i+k]*Pk+P0)*E[0]+sum(B[i+k]*Pk)+1,得到:A[i]=sum(A[i+k]*Pk+P0),B[i]=sum(B[i+k]*Pk)+1。答案为:B[0]/(1-A[0])。
int n,k1,k2,k3,a,b,c;
double p[N],A[N],B[N];
int main()
{
rush()
{
RD(n);
RD(k1,k2,k3);
RD(a,b,c);
double one=1.0/(k1*k2*k3);
int i,j,k;
clr(p,0);
FOR1(i,k1) FOR1(j,k2) FOR1(k,k3)
{
if(i==a&&j==b&&k==c) continue;
p[i+j+k]+=one;
}
clr(A,0); clr(B,0);
FORL0(i,n)
{
for(j=3;j<=k1+k2+k3&&i+j<=n;j++)
{
A[i]+=A[i+j]*p[j];
B[i]+=B[i+j]*p[j];
}
A[i]+=one;
B[i]+=1;
}
PR(B[0]/(1-A[0]));
}
return 0;
}