NC19777 卡牌游戏

题目链接

题目

题目描述

小贝喜欢玩卡牌游戏。某个游戏体系中共有N种卡牌,其中M种是稀有的。小贝每次和电脑对决获胜之后都会有一个抽卡机会,这时系统会随机从N种卡中选择一张给小贝。普通卡可能多次出现,而稀有卡牌不会被重复抽到。小贝希望收集到K种稀有卡牌,她想知道期望需要多少次获胜才能实现这个目标。

输入描述

数据有多组,第一行一个整数T表示数据组数。
每组数据一行,三个整数N,M,K .

输出描述

对于每组数据,输出形如"Case #x: y",其中 x 为这组数据的编号(从1开始),y 为这组数据的答案。答案的绝对误差或相对误差在10-6以内都认为是正确的。

示例1

输入

2
5 2 1
40 9 5

输出

Case #1: 2.5
Case #2: 28.1146825397

备注

1 ≤ T ≤ 100
1 ≤ N ≤ 10^5
1 ≤ M ≤ N
1 ≤ K ≤ M

题解

知识点:概率dp。

fi 表示已经抽到 i 张稀有牌后还需要抽几次的期望。有转移方程:

fi=(fi+1+1)mini+(fi+1)nmni

稍作变形:

fi=fi+1+nimi

所以 f0=i=0k1nimi

时间复杂度 O(k)

空间复杂度 O(1)

代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
bool solve() {
int n, m, k;
cin >> n >> m >> k;
double ans = 0;
for (int i = k - 1;i >= 0;i--) ans += (double)(n - i) / (m - i);
cout << fixed << setprecision(9) << ans << '\n';
return true;
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t = 1;
cin >> t;
for (int i = 1;i <= t;i++) {
cout << "Case #" << i << ": ";
if (!solve()) cout << -1 << '\n';
}
return 0;
}
posted @   空白菌  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示