//----------------------------------------------------------------- // Dinner Lottery ( P = 2 ) // Author: Ana Paula Tomas // November 2016 //----------------------------------------------------------------- #include #include #define DEBUG // P cannot change #define P 2 // problem bounds #define NMAX 50 #define KMAX 10 #define DRAWSIZE 10 #define MIN(X,Y) ((X) < (Y)? (X):(Y)) #define MAX(X,Y) ((X) > (Y)? (X):(Y)) int N, K, Draw; double Time[KMAX+1][KMAX+1][KMAX+1]; double Comb[NMAX+1][DRAWSIZE+1]; // KMAX and DRAWSIZE same value void init_comb() { int i,j, r = MAX(Draw,K); Comb[0][0]=1; for(i=0; i= 0) return Time[c][a][b]; Time[c][a][b] = 0; p0 = 0; for(sc=MAX(0,Draw-(N-c)); sc <= MIN(c,Draw); sc++) for(sa=MAX(0,(Draw-sc)-(N-c-a)); sa <= MIN(a,Draw-sc); sa++) for(sb=MAX(0,(Draw-sc-sa)-(N-c-a-b)); sb <= MIN(b,Draw-sc-sa); sb++) { sr = Draw-sc-sa-sb; if (sc==0 && sa==0 && sb ==0) p = p0 = Comb[N-a-b-c][sr]; else { p = Comb[c][sc]*Comb[a][sa]*Comb[b][sb]*Comb[N-a-b-c][sr]; Time[c][a][b] += p*find_time(c-sc,a-sa,b-sb); } total += p; } Time[c][a][b] += total; Time[c][a][b] /= (total-p0); Time[c][b][a] = Time[c][a][b]; return Time[c][a][b]; } int main() { int k, i, c; int bet[NMAX+1]={0}; scanf("%d%d%d",&N,&Draw,&K); c = 0; for(k=0;k