尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Codeforces Round 1049 (Div. 2) E

Codeforces Round 1049 (Div. 2) E
📅 发布时间:2026/6/20 14:54:04

Codeforces Round 1049 (Div. 2) E2

解题思路

说白了题目就是让我们求

\[\sum_{i = 1}^{m}i \times cnt_i \]

其中 \(cnt_i\) 的含义是,最后结果为 \(i\) 的初始局面的数量。

要是能以合理的时空复杂度求出 \(cnt_i\) 当然是极好的,但是这看起来就非常困难...

有一个比较常规的转换方式是:

\[\sum_{i = 1}^{m}i \times cnt_i = \sum_{i = 1}^{m} suf_i \]

其中 \(suf_i\) 的含义是,最后结果大于等于 \(i\) 的初始局面的数量。

为什么可以这样做呢?根据定义我们有:

\[suf_i = \sum_{j = i}^{m}cnt_j \]

代入到上式可以发现 \(cnt_i\) 正好被计算了 \(i\) 次。

那么如何维护出 \(suf\) 呢,当要计算 \(suf_i\) 时,我们并不关心初始局面每个位置具体是什么数,只关心三个方面:

  1. 每个数与 \(i\) 的大小关系。
  2. 有多少个数是大于等于 \(i\) 的。
  3. 最终的结果是否大大于等于 \(i\)。

根据前两个方面,我们可以将一个初始局面压缩成一个二进制数,二进制数中为 0 的位表示对应的数小于 \(i\),为 1 的位表示对应的数大于等于 \(i\)。至于如何判断一个局面的最终结果是否大于等于 \(i\),需要用一点博弈论的知识,对于 Alice 来说,只需要当前状态(局面)存在一个次态的结果是大于等于 \(i\) 的,那么当前状态的最终结果就是大于等于 \(i\) 的,对于 Bob同理。

于是我们可以设计 \(f_{l,u,0/1}\) 表示对于长度为 \(l\) 的局面 \(u\) 且当前是 Bob/Alice 在操作的结果是否大于等于 \(i\)(最后维护出来的 \(f\) 的结果与 \(i\) 的取值无关)。转移就像上面所说的一样。

维护出 \(f\) 之后,我们统计一下有多少包含了 \(x\) 个大于等于 \(i\) 的数的初始局面的结果是大于等于 \(i\) 的,记为 \(cnt_x\)。于是答案就是:

\[\sum_{i = 1}^{m} \sum_{x = 0}^{n} (i - 1)^{n - x}(m - i + 1)^{x}cnt_x \]

CODE
int c[N];bool f[N + 5][1 << N][2]; // f[i][u][0/1] 对于长度为 i 的初始状态u,以Bob/Alice先手时最终的结果(1:>= k, 0:<k)
int cnt[N + 5];i64 qpow(i64 a, i64 p) {i64 res = 1ll;while (p) {if (p & 1) {(res *= a) %= Mod;}(a *= a) %= Mod;p >>= 1;}return res;
}// 取走 u 的第p个位后得到的状态
int getv(int u, int p) {int mask = (1 << p) - 1;int v = (u & mask);u >>= 1;u &= ~mask;v |= u;return v;
}void solve() {int n = 0, m = 0, k = 0;std::cin >> n >> m >> k;for (int i = 0; i < k; ++i) {std::cin >> c[i];}f[1][0][0] = f[1][0][1] = false;f[1][1][0] = f[1][1][1] = true;for (int i = 2; i <= n; ++i) {for (int u = 0; u < (1 << i); ++u) {auto &Bob = f[i][u][0];auto &Alice = f[i][u][1];Bob = true;Alice = false;for (int j = 0; j < k; ++j) {if (c[j] > i) {break;}int v = getv(u, c[j] - 1);Bob &= f[i - 1][v][1];Alice |= f[i - 1][v][0];}}}for (int i = 0; i <= n; ++i) {cnt[i] = 0;}for (int u = 0; u < (1 << n); ++u) {if (f[n][u][1]) {cnt[std::__popcount(u)]++;}}i64 ans = 0;for (int i = 0; i < m; ++i) {for (int j = 0; j <= n; ++j) {(ans += qpow(i, n - j) * qpow(m - i, j) % Mod * cnt[j]) %= Mod;}}std::cout << ans << '\n';
}

相关新闻

  • 批量设置Excel样式格式(如:纸张大小,排版,字体等)+ 支持windows系统
  • 张瑜:牛市进程之十大观察指标 - Leone
  • Windows 11 系统优化

最新新闻

  • 从旋转不变到精准定位:深入解析ESPRIT算法的原理与实现
  • VisualGDB 6.0:解锁Visual Studio跨平台嵌入式与Linux开发新体验
  • 2026 年吉林市厨卫屋顶防水修缮三家对比测评 吉修匠 99.8 分稳居榜首 - 吉修匠
  • 企业境外投资证书丢失怎么登报?2026最新办理流程 - 速递信息
  • 2026 国内论文辅导机构行业盘点:5 家实测机构与甄选攻略 - 艾德思Editsprings
  • 2026 630~650分段人工智能AI专业985高校适配指南:中南大学人工智能领域专业实力解析 - 温茶叙旧

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号