不写了,转别人的题解,但是还没有想明白这样做的道理。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <set> #include <map> #include <string> #include <list> #include <cstdlib> #include <queue> #include <stack> #define ALL(a) a.begin(), a.end() #define clr(a, x) memset(a, x, sizeof a) #define fst first #define snd second #define pb push_back #define lowbit(x) (x&(-x)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define rep1(i,x,y) for(int i=x;i<=y;i++) using namespace std; typedef long long LL; typedef pair<int, int> pii; const int inf =0x3f3f3f3f; const int N = 600; int n,k1,k2,k3,aa,bb,c; double p[N],a[N],b[N]; void dp(int i){ if(i > n){ a[i]=b[i]=0; return ;} if(a[i] > 0) return ; a[i] =p[0]; b[i] = 1; for(int k=3;k<=k1+k2+k3;k++){ dp(i+k); a[i]+=p[k]*a[i+k]; b[i]+=p[k]*b[i+k]; } return ; } int main() { int T; scanf("%d",&T); while(T--){ scanf("%d %d %d %d %d %d %d",&n,&k1,&k2,&k3,&aa,&bb,&c); clr(p,0); p[0]=1.0/(k1*k2*k3); rep1(i,1,k1) rep1(j,1,k2) rep1(k,1,k3) if(i!=aa || j!=bb || k!= c) p[i+j+k]+=1.0/(k1*k2*k3); clr(a,-1); clr(b,-1); dp(0); printf("%.10lf\n",b[0]/(1-a[0])); } return 0; }