 /**//*
題意: 給出3個(gè)骰子,每次投3個(gè),起始count=0
若投出的三個(gè)骰子分別為a,b,c,則count=0;
否則count+=投出的3個(gè)數(shù)之和;
若count>n ,結(jié)束
對于期望值,一般定義的Ex都是表示離目標(biāo)狀態(tài)還需要的代價(jià)
所以這里定義E[i]表示當(dāng)前狀態(tài)為i離結(jié)束還需要代價(jià)的期望值,那答案就是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]的同時(shí)又要用到E[0] 這樣會(huì)形成一個(gè)環(huán)
但這個(gè)環(huán)很有特點(diǎn),E[0]存在于每個(gè)環(huán)上
所以如果每個(gè)E[i+k]都表示成E[0],由于只涉及到乘法、加法,那么E[i]也可以用
E[0]表示咯,就這樣推到E[0]
E[i] = x[i]*E[0]+y[i]

神奇,用這種表示方法。因?yàn)镋[0]存在于每個(gè)環(huán)上,那當(dāng)然環(huán)上的東西就可以用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;
}
|