There is a very simple and interesting one-person game. You have 3 dice, namelyDie1,Die2 and Die3. Die1 hasK1 faces.Die2 has K2 faces.Die3 has K3 faces. All the dice are fair dice, so the probability of rolling each value, 1 toK1,K2, K3 is exactly 1 /K1, 1 /K2 and 1 / K3. You have a counter, and the game is played as follow:
- Set the counter to 0 at first.
- Roll the 3 dice simultaneously. If the up-facing number of Die1 isa, the up-facing number ofDie2 is b and the up-facing number ofDie3 isc, set the counter to 0. Otherwise, add the counter by the total value of the 3 up-facing numbers.
- If the counter's number is still not greater than n, go to step 2. Otherwise the game is ended.
Calculate the expectation of the number of times that you cast dice before the end of the game.
Input
There are multiple test cases. The first line of input is an integer T (0 <T <= 300) indicating the number of test cases. ThenT test cases follow. Each test case is a line contains 7 non-negative integersn,K1, K2, K3,a,b, c (0 <= n <= 500, 1 < K1,K2,K3 <= 6, 1 <= a <= K1, 1 <=b <=K2, 1 <= c <= K3).
Output
For each test case, output the answer in a single line. A relative error of 1e-8 will be accepted.
Sample Input
2 0 2 2 2 1 1 1 0 6 6 6 1 1 1
Sample Output
1.142857142857143 1.004651162790698
参考bin神的代码,分离系数,不需高斯消元
/** Author: ☆·aosaki(*’(OO)’*) niconiconi★ **/
//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#include<bits/stdc++.h>
#include <iostream>
#include <sstream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <functional>
#include <cmath>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <list>
#include <stack>
//#include <tuple>
#define mem(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define lp(k,a) for(int k=1;k<=a;k++)
#define lp0(k,a) for(int k=0;k<a;k++)
#define lpn(k,n,a) for(int k=n;k<=a;k++)
#define lpd(k,n,a) for(int k=n;k>=a;k--)
#define sc(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define lowbit(x) (x&(-x))
#define ll long long
#define pi pair<int,int>
#define vi vector<int>
#define PI acos(-1.0)
#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define TT cout<<"*****"<<endl;
#define TTT cout<<"********"<<endl;
inline int gcd(int a,int b)
{
return a==0?b:gcd(b%a,a);
}
#define INF 1e9
#define eps 1e-8
#define mod 10007
#define MAX 10010
using namespace std;
double A[800],B[800];
double p0,ha[100];
int main()
{
//freopen("in.txt","r",stdin);
int t,n,k1,k2,k3,a,b,c;
cin>>t;
while(t--)
{
scanf("%d %d %d %d %d %d %d",&n,&k1,&k2,&k3,&a,&b,&c);
p0=1.0/k1/k2/k3;
mem(A);
mem(B);
mem(ha);
lp(i,k1)
lp(j,k2)
lp(k,k3)
{
if(i==a && j==b && k==c) continue;
ha[i+j+k]+=p0;
}
lpd(i,n,0)
{
A[i]=p0;
B[i]=1;
lp(j,k1+k2+k3)
{
A[i]+=A[i+j]*ha[j];
B[i]+=B[i+j]*ha[j];
}
}
printf("%.15f\n",B[0]/(1.0-A[0]));
}
return 0;
}