 /**//*
题意: 给出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;
}
|