CF768D Jon and Orbs 题解
题意:有 $N$ 种物品,每天随机取一件,取到每种物品的概率相同。
存在天数 $k$,使得 $k$ 天内取过 $N$ 种物品的概率不小于 $\dfrac p{2000}$。
多组询问,每组询问给定 $p$,求 $k$ 的最小值。
思路
考虑概率 DP。设 $f_{i,j}$ 为 $i$ 天内取过 $j$ 种物品的概率。
分类讨论 $i$ 天内取过 $j$ 种物品的前提下,第 $i$ 天取的物品 $i-1$ 天内是否取过。
若第 $i$ 天取的物品 $i-1$ 天内取过,则 $i$ 天内取过 $j$ 种物品的概率为 $f_{i-1,j}\times\dfrac jn$。
若第 $i$ 天取的物品 $i-1$ 天内没取过,则 $i$ 天内取过 $j$ 种物品的概率为 $f_{i-1,j-1}\times\dfrac{n-j+1}n$。
综上所述,$f_{i,j}=f_{i-1,j}\times\dfrac jn+f_{i-1,j-1}\times\dfrac{n-j+1}n$。
预处理到 $f_{10000,n}$,每组询问暴力找 $k$ 即可。
代码
#include <cstdio>
int n, i, q;double p, f[10050][1050];
int main()
{
scanf("%d%d", &n, &q);f[0][0] = 1;for(int i = 1;i <= 10000;++i) for(int j = 1;j <= n;
++j) f[i][j] = f[i - 1][j] * j / n + f[i - 1][j - 1] * (n - j + 1) / n;while(q--)
{scanf("%lf", &p);p /= 2000;for(i = 1;f[i][n] < p;++i);printf("%d\n", i);}return 0;
}

浙公网安备 33010602011771号