#!/bin/bash gcc -O2 -x c - -o cal-mean < #include #include #include typedef union { uint64_t i; double p; }data_t; data_t * data; double cal_mean(int *n, int sub_pos, int a_cnt, const double *p, const int *seq) { int i, pos = 0; double f1 = 1.0, f2 = 1.0; if(a_cnt == 0) { n[sub_pos]++; return 0.0; } for(i=0;i<11;i++) pos += n[i]*seq[i]; if(data[pos].i) { n[sub_pos]++; return data[pos].p; } for(i=0;i<11;i++) { if(n[i]) { n[i]--; f1 += cal_mean(n,i,a_cnt-1,p,seq) * p[i]; } else { f2 -= p[i]; } } f1 /= f2; data[pos].p = f1; n[sub_pos]++; return f1; } int main(int argc, char**argv) { int i, n[11], seq[11]; double mean, p[11]; data = malloc(sizeof(data_t)*atoi(argv[1])); if(data == NULL) { return 1; } for(i=0;i<11;i++) { p[i] = (6-(i+1)/2)/36.0; } while(1) { if(11 != scanf("%d%d%d%d%d%d%d%d%d%d%d", &n[0],&n[1],&n[2],&n[3],&n[4],&n[5], &n[6],&n[7],&n[8],&n[9],&n[10])) break; for(i=0;i<11;i++) printf("%d ",n[i]); seq[0] = 1; for(i=1;i<11;i++) seq[i] = seq[i-1]*(n[i-1]+1); memset(data,0,sizeof(data_t)*seq[10]*(n[10]+1)); mean = cal_mean(n,0,36,p,seq); printf("%.8lf\n", mean); } free(data); return 0; } EOF racket <(cat < n max-num) '() (list (list n))) (apply append (map (lambda (a) (map (lambda (x) (cons a x)) (list-all (- n a) (- pieces 1) a))) (range 0 (+ (min n max-num) 1)))))) (define (pr lst) (if (null? lst) (newline) (begin (display (car lst)) (write-char #\space) (pr (cdr lst))))) (for-each pr (list-all 36 11 36)) EOF ) >input.txt ./cal-mean $(awk '{x=1;for(i=1;i<=NF;i++)x*=$i+1;if(sizeoutput.txt sort -k 12 -n output.txt | head -n 1