Description

\(n\) 种物品,求一次取一件把所有种类取遍的概率不小于给定值 \(p/2000\) 的最小天数。

Solution

\(f[i][j]\) 表示前 \(i\) 次取出了 \(j\) 种的概率,则

\[f[i][j]=\frac j n f[i-1][j] + \frac {n-j+1} n f[i-1][j-1] \]

\(m\) 为一足够大的数(不妨取 \(10^4\)),则对于每个询问,找到最小的 \(k\) 使得 \(f[m][n] \ge p/2000\) 即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 2005;

int n,q,p[N];
double f[N*5][N];

signed main()
{
    ios::sync_with_stdio(false);
    cin>>n>>q;
    for(int i=1;i<=q;i++)
    {
        cin>>p[i];
    }
    f[0][0]=1;
    int m=1e4;
    for(int i=1;i<=m;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;
        }
    }
    for(int i=1;i<=q;i++)
    {
        int t=1;
        for(int j=1;j<=m;j++)
        {
            if(f[j][n]<p[i]*0.0005) ++t;
        }
        cout<<t<<endl;
    }
}

相关文章: