题意:
抛三个色子,三个色子分别为k1,k2,k3个面,如果抛出的色子第一个为a,第二个为b,第三个为c这counter置0,否则加上(a+b+c)
思路:
还是不会啊果然太弱了
看了大佬们的博客慢慢的学会了点东西
同样e[i]表示从i到n的期望
e[i]=sigma(p[j]*e[i+j])+p[0]*e[0]+1
e[i]=A[i]*e[0]+B[i];
e[i]=sigma(p[j]*(A[i+j]*e[0]+B[i+j]))+p[0]*e[0]+1
e[i]=e[0]*(p[0]+sigma(p[j]*(A[i+j]) +sigma(p[j]*B[i+j])+1;
A[i]=p[0]+sigma(p[j]*(A[i+j])
B[i]=sigma(p[j]*B[i+j])+1;
e[0]=A[0]*e[0]+B[0];
e[0]=B[0]/(1-A[0]);
#include<stdio.h>
#include<string.h>
double A[600],B[600],p[20];
/*
e[i]=sigma(p[j]*e[i+j])+p[0]*e[0]+1
e[i]=A[i]*e[0]+B[i];
e[i]=sigma(p[j]*(A[i+j]*e[0]+B[i+j]))+p[0]*e[0]+1
e[i]=e[0]*(p[0]+sigma(p[j]*(A[i+j]) +sigma(p[j]*B[i+j])+1;
A[i]=p[0]+sigma(p[j]*(A[i+j])
B[i]=sigma(p[j]*B[i+j])+1;
e[0]=A[0]*e[0]+B[0];
e[0]=B[0]/(1-A[0]);
*/
int main()
{
int t;
scanf("%d",&t);
int n;
int p1,p2,p3, aa, bb, cc;
double kk;
while(t--)
{
scanf("%d%d%d%d%d%d%d",&n, &p1, &p2, &p3, &aa, &bb, &cc);
memset(p,0,sizeof(p));
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
kk=1.0*(p1*p2*p3);
for(int i=1;i<=p1;i++)
for(int j=1;j<=p2;j++)
for(int k=1;k<=p3;k++)
{
if(i==aa&&j==bb&&k==cc)continue;
p[i+j+k]+=1.0/kk;
}
p[0]=1.0/kk;
for(int i=n;i>=0;i--)
{
A[i]=p[0];
B[i]=1.0;
for(int j=1;j<=p1+p2+p3;j++)
{
A[i]+=p[j]*A[i+j];
B[i]+=p[j]*B[i+j];
}
}
printf("%.16lf\n",B[0]/(1-A[0]));
}
return 0;
}