http://acm.fzu.edu.cn/problem.php?pid=2278
设有n张卡片, 已抽到了k张不同的卡片, 则抽第k + 1张未抽到过的卡片的期望次数:
比如说抽一张牌的概率是1/4,我们抽到它的期望次数是4次以此类推。
然后花费金币的期望:
所以预处理一下n <= 3000的阶乘, 即可在O(n)时间内求出期望,
记得使用java的bigInteger,较为方便
import java.util.*;
import java.math.*;
public class Main {
public static void main(String args[]) {
Scanner cin=new Scanner(System.in);
BigInteger b[]= new BigInteger[4000];
b[0]=new BigInteger("1");
for (int i=1;i<4000;i++) {
b[i]=b[i-1].multiply(new BigInteger(i+""));
}
int t=cin.nextInt();
while (t-->0) {
int n=cin.nextInt();
BigInteger ans=new BigInteger("0");
for (int i=1;i<=n;i++) {
ans=ans.add(b[n].divide(new BigInteger(i+"")));
}
System.out.print(ans);
System.out.println(".0");
}
}
}