题意: 有n张不同的卡片, 每花费W (W = (n - 1)!)个金币可以抽一次卡片, 每种卡片被抽到的概率都是1/n, 求抽到所有不同的卡片, 花费金币数量的期望值.
思路: 假设共有n张卡片, 已经抽到了k张不同的卡片, 则抽第k + 1张未抽到过的卡片的期望次数:
所以花费金币的期望:
所以预处理一下n <= 3000的阶乘, 即可在O(n)时间内求出期望,由于n <= 3000, n! 太大, 所以用Java的BigInteger计算比较方便
import java.math.BigInteger;
import java.util.*;
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++) {
String d = i + "";
b[i] = b[i - 1].multiply(new BigInteger(d));
}
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");
}
cin.close();
}
}
本文探讨了在概率相同的条件下,收集所有不同卡片所需的平均金币数。通过数学期望的计算方法,采用Java的BigInteger实现大整数运算,解决n不超过3000时的卡片收集问题。
1693

被折叠的 条评论
为什么被折叠?



