Description
小贝喜欢玩卡牌游戏。某个游戏体系中共有N种卡牌,其中M种是稀有的。小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝。普通卡可能多次出现,而稀有卡牌不会被重复抽到。小贝希望收集到K种稀有卡牌,她想知道期望需要多少次获胜才能实现这个目标。
输入描述:
数据有多组,第一行一个整数T表示数据组数。
每组数据一行,三个整数N,M,K .
输出描述:
对于每组数据,输出形如"Case #x: y",其中 x 为这组数据的编号(从1开始),y 为这组数据的答案。答案的绝对误差或相对误差在以内都认为是正确的。
备注
1 ≤ T ≤ 100
1 ≤ N ≤ 105
1 ≤ M ≤ N
1 ≤ K ≤ M
Sample Input
2
5 2 1
40 9 5
Sample Ouput
Case #1: 2.5
Case #2: 28.1146825397
Source::传送门
题解
题意:N种牌,M种稀有,每抽一次,会随机从N种牌中抽取一张,但M种稀有牌不会重复抽到。现在想得到K种稀有卡牌,问抽牌的次数期望是多少。
第一次做期望题目,有点迷。关键解题就是得推公式了!
推导过程:
1.当k = 1 时:第一次抽到概率
第二次抽到概率为 *
....
第n次的抽到的概率为*
期望 E= 1* + 2 * * * * = - n * (错位相减求和)
当 时, 由单调性等可判断出 E=
2.当k = 2时,因为M种稀有牌不会重复得到,所以可以分解为两个子问题,即可理解为先从N种牌,M种稀有种得到一个,再从N-1种牌,M-1种稀有种得到1种。所以E = + .
3.依次类推 E = 。
AC Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = (int)1e5+10;
const int INF = 0x3f3f3f3f;int main()
{int T, n, m ,k, id = 0;cin>> T;while(T--){id++;cin>> n >> m >> k;double ans = 0;for(int i=1; i<=k; i++){ans += 1.0 * n / m;n--; m--;}printf("Case #%d: %lf\n",id,ans);}return 0;
}