一个n面的骰子,求期望掷几次能使得每一面都被掷到
优惠券收集者问题
f[i]表示已掷到i面,还期望掷多少面才能使每一面都掷到
有(frac in)的概率掷到已掷到的,(frac{n-i}f)的概率掷到未掷到过的
所以(f[i]=frac in imes f[i] +frac {n-i}n imes f[i+1]+1)
即(掷到已掷到的概率 imes已掷到i面还期望掷的次数+掷到未掷到的概率 imes掷到i+1面还期望掷的次数)至少得掷一次所以后面+1
化简得(f[i]=f[i+1]+frac n{n-i})
#include <iostream>
using namespace std;
const int N=10000+5,M=20000+5,inf=0x3f3f3f3f,P=19650827;
int n;double f[N];
template <class t>void rd(t &x){
x=0;int w=0;char ch=0;
while(!isdigit(ch)) w|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
x=w?-x:x;
}
int main(){
// freopen("in2.txt","r",stdin);
//freopen("xor.out","w",stdout);
int T;rd(T);
while(T--){
rd(n);f[n]=0;
for(int i=n-1;i>=0;--i) f[i]=f[i+1]+(double)n/(n-i);
printf("%.2lf
",f[0]);
}
return 0;
}