牛客IOI周赛25-提高组 A.找滚木(概率统计)
链接:https://ac.nowcoder.com/acm/contest/11243/A
来源:牛客网
题目描述
NIT正在玩皇室战争,NIT需要一种叫滚木的卡牌。众所周知皇室战争一共有n(n<=100000)种卡牌,NIT每开一个宝箱就能得到一张卡牌(宝箱开到每种卡牌的概率都是一样的)。现在NIT有一个换卡币,当NIT有两张一样(种类相同)的卡牌时,NIT可以用换卡币和这张卡牌换到滚木这张卡牌。NIT很想知道期望开多少个宝箱就可以得到滚木这张卡牌。
输入描述:
输入一个正整数n(n<=100000)表示皇室战争有多少张卡牌。
输出描述:
输出一个小数,保留两位小数,表示期望开多少个宝箱可以拿到滚木这张卡。
示例1
输入
[复制](javascript:void(0)😉
2
输出
[复制](javascript:void(0)😉
1.50
利用概率知识手玩一下即可。注意当开n个宝箱的时候一定可以得到这张卡,以及注意那个类似排列数的东西需要预处理一下求一个类似前缀积的数列出来。
#include <bits/stdc++.h>
using namespace std;
int n;
double pre[100005];
int main() {
cin >> n;
double ans = 0;
pre[0] = 1.0;
for(int i = 1; i <= n + 1; i++) {
pre[i] = pre[i - 1] * (1.0 * n - 1.0 * i) / n;
}
for(int i = 1; i <= n; i++) {
if(i == 1) {
ans += 1.0 / n;
continue;
}
ans += i * 1.0 * (1.0 * i / n * pre[i - 1]);
}
printf("%.2lf", ans);
return 0;
}