题目链接:https://codeforces.com/problemset/problem/768/D
题意:有一只鸟每天在树下下一个蛋,他可以下n种蛋,每种蛋的概率一样。有q次询问,问至少多少天后,树下有n种蛋的概率大于等于p/2000。
思路:概率dp,dp[i][j]表示前i天下了j种蛋,首先临界值为dp[1][1]=1,然后对于其他的,鸟每天下一个蛋,那种蛋他可能下过,也可能没下过,
转移方程为dp[i][j]=(double)(n-j+1)/n*dp[i-1][j-1]+(double)j/n*dp[i-1][j];
#include<bits/stdc++.h> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; double dp[10005][1005]; int main() { int n,q; cin>>n>>q; dp[1][1]=1; for(int i=2;i<=10000;i++) { for(int j=1;j<=i&&j<=n;j++) dp[i][j]=(double)(n-j+1)/n*dp[i-1][j-1]+(double)j/n*dp[i-1][j]; if(dp[i][n]>=0.5) break; } while(q--) { double x; cin>>x; double sum=x/2000; for(int i=1;;i++) { if(dp[i][n]>=sum) { cout<<i<<endl; break; } } } }