您的位置:首页 > 其它

CodeForces 248E Piglet's Birthday (概率)

2016-07-17 16:05 351 查看
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;

#define N 100020

int n, a
, aa
;
int c
;
long double p
[120];

long double C(int a, int b) {
long double ret = 1;
for(int i = 1; i <= b; ++i)
ret *= (a - i + 1.0) / i;
return ret;
}

long double f(int a, int b, int c, int d) {
if(a - b < c - d) return 0;
if(a < b) return 0;
return C(b, d) * C(a - b, c - d) / C(a, c);
}

int main() {
scanf("%d", &n);
long double ans = 0;
for(int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
if(a[i] == 0) ans += 1;
aa[i] = a[i];
p[i][a[i]] = 1;
c[i] = a[i];
}
int q;
scanf("%d", &q);

while(q--) {
int u, v, k;
scanf("%d%d%d", &u, &v, &k);
ans -= p[u][0];
for(int i = 0; i <= aa[u]; ++i) {
p[u][i] *= f(c[u], i, k, 0);
for(int j = 1; i + j <= aa[u] && j <= k; ++j) {
p[u][i] += p[u][i + j] * f(c[u], i + j, k, j);
}
}
ans += p[u][0];
c[u] -= k;
c[v] += k;
printf("%.12lf\n", (double)ans);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: