Step1 Problem:
求n种类型SSR,至少每样抽到一个的期望天数(抽一次的天数 (n-1)的阶层)。
数据范围:
1<=n<=3000
Step2 Involving algorithms:
数学期望 && 大数
Step3 Ideas:
X表示,至少每样抽到一个的天数的随机变量,求E(X).
Ei:拥有 i-1 张不一样的,在此基础上抽到新牌的所需期望次数。
E(X) = ( E1 + E2 + E3 + … + En ) * one_day.
对于第一张新牌 抽到的概率 n/n
对于第二张新牌 抽到的概率 (n-1)/n
对于第n张新牌 抽到的概率 (n-(n-1))/n = 1/n
…分界线…
对于第n张新牌,抽到的概率设为p, 第k次抽到的概率为 p*(1-p)^(k-1)
我们求 抽到的所需次数的期望(抽到可能需要多少次)
q = 1 - p;
E(x) = p + 2pq + 3pq^2 + 4pq^3 + … + kpq^(k-1)
E(x) = p(1 + 2q + 3q^2 + 4q^3 + … + kq^(k-1))
S = (1 + 2q + 3q^2 + 4q^3 + … + kq^(k-1))
qS = (q + 2q^2 + 3q^3 + 4q^4 + … + (k-1)q^(k-1) + kq^k)
S - qS = 1 + q + q^2 + q^3 + q^4 + … + q^(k-1) - kq^k
S = (1 - q^k)/(1 - q)^2 - k*q^k/(1 - q)
当k无穷大的时候
S = 1 / (1-q)^2
E(x) = 1 / p
对于第一张新牌 抽到的次数期望 1
对于第二张新牌 抽到的次数期望 n/(n-1)
对于第n张新牌 抽到的次数期望 n/1
one_day:抽一次所需的天数
E(X) = 1 * one_day + n/(n-1) * one_day + … + n * one_day;
Step4 Code:
import java.util.*;
import java.math.*;
public class Main
{
public static void main(String[] args)
{
Scanner cin = new Scanner(System.in);
int T, n;
T = cin.nextInt();
for(int Case = 1; Case <= T; Case++)
{
n = cin.nextInt();
BigInteger one_day = BigInteger.valueOf(1);
for(int i = 1; i <= n - 1; i++)
{
one_day = one_day.multiply(BigInteger.valueOf(i));
}
BigInteger total_day = BigInteger.valueOf(0);
for(int i = 1; i <= n; i++)
{
total_day = total_day.add(one_day.multiply(BigInteger.valueOf(n)).divide(BigInteger.valueOf(i)));
}
System.out.print(total_day);
System.out.println(".0");
}
}
}