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;
}
posted @ 2022-08-24 11:30  Jijidawang  阅读(9)  评论(0)    收藏  举报  来源