hdu5985[概率dp] 2016青岛icpc现场赛
#include <bits/stdc++.h> using namespace std; double alldead[12][105]; double rev[12][105]; double p[12][105]; double ans[12]; int a[12]; int T, n; double fastpow(double a, int b) { double ret = 1.0; while (b) { if (b & 1) { ret *= a; } a = a * a; b >>= 1; } return ret; } int main() { scanf("%d", &T); while (T--) { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d%lf", &a[i], &p[i][1]); } if (n == 1) { puts("1.000000"); continue; } for (int i = 1; i <= n; i++) { for (int j = 2; j <= 75; j++) { p[i][j] = p[i][1] * p[i][j - 1]; } rev[i][0] = 1.0; alldead[i][0] = 0.0; for (int j = 1; j <= 75; j++) { alldead[i][j] = fastpow(1.0 - p[i][j], a[i]); rev[i][j] = 1.0 - alldead[i][j]; } } for (int i = 1; i <= n; i++) { for (int j = 1; j <= 72; j++) { double tmp = 1; for (int k = 1; k <= n; k++) { if (k == i) continue; tmp *= alldead[k][j]; } ans[i] += (rev[i][j] - rev[i][j + 1]) * tmp; } } for (int i = 1; i <= n; i++) { if (i != 1) printf(" "); printf("%.6f", ans[i]); ans[i] = 0.0; } puts(""); } return 0; }