/**//* 题意: 给出3个骰子,每次投3个,起始count=0 若投出的三个骰子分别为a,b,c,则count=0; 否则count+=投出的3个数之和; 若count>n ,结束 对于期望值,一般定义的Ex都是表示离目标状态还需要的代价 所以这里定义E[i]表示当前状态为i离结束还需要代价的期望值,那答案就是E[0] E[>n] = 0 E[i] = ∑Pk*E[i+k] + P0*E[0] Pk是三颗骰子和为k的概率,但=a,=b,=c的情况除外 P0是=a,=b,=c的概率,也即1.0/(k1*k2*k3)
我们要求的是E[0],但求E[i]的同时又要用到E[0] 这样会形成一个环 但这个环很有特点,E[0]存在于每个环上 所以如果每个E[i+k]都表示成E[0],由于只涉及到乘法、加法,那么E[i]也可以用 E[0]表示咯,就这样推到E[0] E[i] = x[i]*E[0]+y[i]
神奇,用这种表示方法。因为E[0]存在于每个环上,那当然环上的东西就可以用E[0]表示了 则递推后其它的也可以同样表示了
*/ #include<cstdio> #include<cstring>
const int MAXN = 505;
double x[MAXN],y[MAXN]; double p[20];
inline int min(int a,int b){return a<b?a:b;}
int main() { int T; for(scanf("%d",&T);T--;) { int n,k1,k2,k3,a,b,c; scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c); double pp = 1.0/(k1*k2*k3); memset(p,0,sizeof(p)); for(int i=1;i<=k1;i++) for(int j=1;j<=k2;j++) for(int k=1;k<=k3;k++) p[i+j+k]+=pp; p[a+b+c]-=pp; x[n+1]=0.0,y[n+1]=0.0; for(int i=n;i>=0;i--) { x[i]=pp; y[i]=1.0; for(int k=3;k<=k1+k2+k3;k++) { int j = min(n+1,i+k); x[i]+=p[k]*x[j]; y[i]+=p[k]*y[j]; } } printf("%.15f\n",y[0]/(1-x[0])); } return 0; }
|