2011-0003

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

设f(k)为变为k个吸血鬼的期望的天数,p(k)为k个吸血鬼变为k+1个吸血鬼的概率,那么则f(1)即为题目所求,并且有:

p(k) = k * (n - k) * p / C(n, 2)

f(n) = 0

f(k) = f(k) * (1 - p(k)) + f(k+1) * p(k) + 1

f(k) = f(k+1) + 1 / p(k)

f(1) = f(1) - f(2) + f(2) - f(3) + ... + f(n-1) - f(n) + f(n)

f(1) = 1 / p(1) + 1 / p(2) + ... + 1 / p(n) + f(n)

f(1) = C(n, 2) * sigma(1 / (k * (n - k))) / p    (k:0->n-1)

f(1) = (n - 1) / 2 * sigma(1 / k + 1 / (n - k)) / p

f(1) = (n - 1) * sigma(1 / k) / p

{{{
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int MAXN = 100086;
double f[MAXN];

int main() {
    int i, j, k;
    int m, n;
    int tc;
    double p;

    for (i=1; i<MAXN; ++i) f[i] = f[i-1] + 1.0 / i;
    scanf("%d", &tc);
    while (tc--) {
        scanf("%d %lf", &n, &p);
        printf("%.3lf\n", (n-1)*f[n-1]/p);
    }
    return 0;
}
}}}
[by delta_4d]

设f(k)为变为k个吸血鬼的期望的天数,p(k)为k个吸血鬼变为k+1个吸血鬼的概率,那么则f(1)即为题目所求,并且有:

p(k) = k * (n - k) * p / C(n, 2)

f(n) = 0

f(k) = f(k) * (1 - p(k)) + f(k+1) * p(k) + 1

f(k) = f(k+1) + 1 / p(k)

f(1) = f(1) - f(2) + f(2) - f(3) + ... + f(n-1) - f(n) + f(n)

f(1) = 1 / p(1) + 1 / p(2) + ... + 1 / p(n) + f(n)

f(1) = C(n, 2) * sigma(1 / (k * (n - k))) / p (k:0->n-1)

f(1) = (n - 1) / 2 * sigma(1 / k + 1 / (n - k)) / p

f(1) = (n - 1) * sigma(1 / k) / p

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100086;
double f[MAXN];
int main() {
    int i, j, k;
    int m, n;
    int tc;
    double p;
    for (i=1; i<MAXN; ++i) f[i] = f[i-1] + 1.0 / i;
    scanf("%d", &tc);
    while (tc--) {
        scanf("%d %lf", &n, &p);
        printf("%.3lf\n", (n-1)*f[n-1]/p);
    }
    return 0;
}

[by delta_4d]