题意:一个n面的骰子,问所有面都出现过一次的需要投掷的次数期望
记E[i+1]表示出现i+1面的次数期望,则E[i+1]=(((n-i)/n)*E[I]+1)+(i/n)E[i+1];
((n-i)/n)*E[I]+1的意义是如果这次出现新的一面的次数期望是出现i面的期望乘以出现新的一面的概率,最后加上这次投掷。
(i/n)E[i+1]的意义是有i/n(i/n==1-(n-i)/n)的概率需要E[i+1]次才行出现第i+1个面.
移项化简后的E[I]=E[I-1]+n/(n-i+1)
#include<cstdio>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
double dp[N];
int main() {
int t;
scanf("%d", &t);
for (int k = 1; k <= t; k++) {
int n;
scanf("%d", &n);
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + (double)(1.0 * n / (1.0*n- i+1));
}
printf("Case %d: %lf\n", k, dp[n]);
}
}