当前位置: 首页 > news >正文

题解:qoj17256 Keep or Gamble

题意:给出四个数 \(U,T,P,C\),代表你现在有四种牌,分别有这么多张。你会重复以下操作:

  • 从剩下的牌中选一张扔掉。

  • 如果这张牌是第一类牌,得两分;如果是第二类牌,得一分;如果是第三类牌,不得分;如果是第四类牌,得分清空且直接结束。

你可以随时结束你的操作。

求最好的操作策略下期望得分。\(U,T,P,C\le 10^6\)

做法:

首先 \(P\) 没有啥用,跟我们的答案没关系,扔出来也就是过一手,不影响答案。

考虑我们把第四种牌的代价改一改,假设目前收益为 \(s\),那么他的收益是 \(-s\),并且可以继续摸,如果剩下卡牌的平均值为正数,继续摸;否则立刻结束。解释一下为什么这样是对的因为如果是正的,下一步收益期望就是平均数,显然这样很好,是正收益;否则,你剩下的牌肯定没有一开始多,肯定收益不如开始。

所以我们就可以枚举一下目前的情况,假设用了 \(x\) 张一类牌,\(y\) 张二类牌,答案就是每一步的期望收益,为:

\[\sum_{i=0}^{U}\sum_{j=0}^P\frac{\binom{U}{i}\binom{T}{j}}{\binom{U+T+C}{i+j}}\times \max(0,\frac{2(U-i)+(T-j)-C(2i+j)}{U-i+T-j+C}) \]

第一项是我达到当前这个局面的概率,第二项是下一步的期望。

然后就不太好做了,因为这里有跟两项都相关的项。

那么我们考虑枚举 \(i+j\),去掉这些相关的项,那么对于一个 \(i+j=t\),答案为:

\[\frac{1}{\binom{U+T+C}{t}}\sum_{i=0}^U\binom{U}{i}\binom{T}{t-i}\times\max(0,\frac{2U+T-(C+1)(t+i)}{U+T+C-t}) \]

发现我们可以快速算出 \(i\) 的一个上界限制,记为 \(l\)

分离一下系数,把 \(i\) 乘到组合数里去,那就等于我现在要解决一个形如 \(f(s,t) = \sum\limits_{i=0}^t\binom{U}{i}\binom{V}{s-i}\) 的求和问题。

考虑组合意义,这个东西就等于我们要在 \(U+V\) 个物品里选 \(s\) 个,且前 \(U\) 个中最多选 \(t\) 个物品。首先 \(t\to t+1\) 是简单的,直接加一项即可,重点是对于 \(s \to s + 1\) 如何处理,我们考虑我们可以在 \(f(s,t)\) 的基础上,在剩下 \((U+V-s)\) 个位置里再任选一个,但是这样有两个问题:前 \(U\) 个中会多于 \(t\) 个,对于一个合法方案会统计 \(s+1\) 次。后者好解决,直接除即可,问题是前者,我们考虑这种情况刚好就是前 \(U\) 个中选满 \(t +1\) 个,选择一个作为我们这一次选的位置,减掉即可,写成柿子,那么就有:

\[f(s+1,t) = \frac{f(s,t)(U+V-s) -\binom{U}{t+1}\binom{V}{s-t}(t+1)}{s+1} \]

直接按这个东西递推即可,复杂度线性,有些逆元我偷懒就用了快速幂算了。

代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 3e6 + 5, mod = 998244353;
int u, t, p, c, jc[maxn], revjc[maxn], n, inv[maxn];
void prepare() {jc[0] = jc[1] = revjc[0] = revjc[1] = 1;inv[0] = inv[1] = 1;for (int i = 2; i <= n; i++)jc[i] = jc[i - 1] * i % mod,revjc[i] = (mod - mod / i) * revjc[mod % i] % mod,inv[i] = revjc[i];for (int i = 2; i <= n; i++)revjc[i] = revjc[i] * revjc[i - 1] % mod;
}
int C(int m, int n) {if(m < 0 || n < 0 || m < n)return 0;return jc[m] * revjc[n] % mod * revjc[m - n] % mod;
}
int ans;
int qpow(int x, int k, int p) {int res = 1;while(k) {if(k & 1)res = res * x % p;x = x * x % p; k >>= 1;}return res;
}
int x, y, res;
signed main() {cin >> u >> t >> p >> c;n = u + t + c;prepare();x = res = 0, y = -1;for (int i = 0; i <= u + t; i++) {if(2 * u + t - (c + 1) * i <= 0)break;int lim = (2 * u + t - (c + 1) * i) / (c + 1);int coef = inv[u + t + c - i] * (2 * u + t - (c + 1) * i) % mod * qpow(C(u + t + c, i), mod - 2, mod) % mod;//	cout << coef << "Adf" << " " << inv[u + t + c - i] << " " << C(u + t + c, i) << endl;if(x < i) {res = (res * (u + t - x) - C(u, y + 1) * C(t, x - y) % mod * (y + 1) % mod + mod) % mod * inv[x + 1] % mod;x++;}while(y < lim) {y++;res = (res + C(u, y) * C(t, x - y)) % mod;}while(y > lim) {res = (res - C(u, y) * C(t, x - y) % mod + mod) % mod;y--;}ans = (ans + coef * res) % mod;}x = res = 0, y = -1;for (int i = 1; i <= u + t; i++) {if(2 * u + t - (c + 1) * i <= 0)break;int lim = (2 * u + t - (c + 1) * i) / (c + 1); lim--;if(lim < 0)break;int coef = inv[u + t + c - i] * (c + 1) % mod * qpow(C(u + t + c, i), mod - 2, mod) % mod * u % mod;if(x < i - 1) {res = (res * (u - 1 + t - x) - C(u - 1, y + 1) * C(t, x - y) % mod * (y + 1) % mod + mod) % mod * inv[x + 1] % mod;x++;}while(y < lim) {y++;res = (res + C(u - 1, y) * C(t, x - y)) % mod;}while(y > lim) {res = (res - C(u - 1, y) * C(t, x - y) % mod + mod) % mod;y--;}ans = (ans - coef * res % mod + mod) % mod;}cout << ans << endl;return 0;
}
http://www.jsqmd.com/news/535028/

相关文章:

  • 全球微高压氧舱:健康消费升级与康复需求驱动下的爆发扩容,2026-2032年CAGR14.9%,2032年规模4.14亿美元
  • ZLMediaKit专业级流媒体服务器:3步完成高效部署方案
  • Lightpanda无头浏览器:11倍性能提升的自动化革命指南
  • 从焊接台到代码:手把手调试LAN8742以太网PHY的5个关键步骤
  • 5步搞定黑苹果配置:OpCore Simplify让EFI生成效率提升95%的实战指南
  • AI智能体权限过大?OpenClaw等框架的5个高危配置必须检查,否则代码真会“裸奔“!
  • 20253912 2025-2026-2 《网络攻防实践》第二周作业
  • ssm+java2026年毕设舒旅程旅游景点预订网站【源码+论文】
  • Flutter GetX Snackbar实战:5分钟实现顶部弹窗通知(附完整属性表)
  • foobar2000终极美化指南:foobox-cn皮肤引擎深度解析与实战应用
  • IPED插件依赖管理深度解析:构建可扩展的数字取证架构
  • EDR绕过新思路:通过ETW补丁实现无痕渗透测试(Windows环境)
  • 如何通过ldn_mitm实现Switch远程局域网联机?
  • 基于拓扑结构的光子晶体研究:文献复现与C6晶胞能带分析
  • 2021年PRL文章:傅里叶调制晶格参数实现高Q因子的非对称超表面
  • 穿墙透视的WiFi革命:RuView无摄像头人体感知技术全解析
  • 腾讯优图文档解析神器:上传图片秒转Markdown,手写体印章都能识别
  • 别再一个点一个点更新了!用Python手把手实现分块LMS(BLMS)滤波器,处理音频降噪实战
  • Revit模型Web端免费展示:从IFC到GLTF,我踩过的坑和避坑指南
  • 5步解锁老旧Mac潜力:OpenCore Legacy Patcher完整升级指南
  • VASP计算数据清洗实战:用Python脚本批量处理vasprun.xml,为机器学习势函数准备训练集
  • 1020 - 顶刊复现:配电网两阶段鲁棒故障恢复(Matlab实现)
  • 深入解析MultipartFile:从本地文件读取到重复读取的实践技巧
  • 图像分类模型实战指南:从技术选型到部署优化的全流程解析
  • 如何用CLIP多模态模型实现跨模态智能交互
  • 7步掌握企业级IT资产管理系统部署与运维
  • 边缘设备跑大模型?DeepSeek-R1-Distill-Qwen-1.5B实时推理实战
  • 从手机到车载屏:深入聊聊LCD闪烁(Flicker)那些事儿,及对用户体验的隐形影响
  • golang context.WithTimeout - running
  • 5分钟快速上手:Blender插件与资源终极指南,让你成为3D创作高手