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

Atcoder Beginner Contest 488

E - Count 123

问题核心

\(x_1\) 个1,\(x_2\) 个2,\(x_3\) 个3组成一个相邻数最多差1的序列,问多少种组合结果对998244353取模。

思路

经典的组合数取模加逆元问题,只需要考虑怎么组合构造答案就行,先排1和3的位置,分为四种情况

  • 1开头1结尾,也就是将1分成 \(i\) 份,3分成\(i-1\)份,其中 \(k = 2i - 2\) 个位置一定需要2,\(i\) 最大是 \(min(x_1,x_3 + 1)\)
  • 3开头3结尾,将1分成 \(i-1\) 份,3分成 \(i\) 份,其中 \(k = 2i - 2\) 个位置一定需要2,\(i\) 最大是 \(min(x_1 + 1,x_3)\)
  • 1开头3结尾或3开头1结尾,将1和3分成 \(i\) 份,其中 \(k = 2i - 1\) 个位置一定需要2,\(i\) 最大是 \(min(x_1,x_3)\)

确定好1和3的排列情况后,假设 \(x_1 + x_3 = L\) ,接下来要在 \(L + 1\) 个空位里放 \(x_2 - k\) 个 2,因为其中 \(k\) 个位置是必须放的,这是典型的星与条问题,与隔板法的区别看这里,总共\(\binom{L + x_2 - k}{L}\) 种结果,最终答案:

\[\binom{x_1 - 1}{i - 1} \binom{x_3 - 1}{i - 2} \binom{L + x_2 - k}{L} + \binom{x_1 - 1}{i - 2} \binom{x_3 - 1}{i - 1} \binom{L + x_2 - k}{L} + 2\binom{x_1 - 1}{i - 1} \binom{x_3 - 1}{i - 1} \binom{L + x_2 - k}{L} \]

总结和反思

  1. 以后遇到把两堆东西排一起的种类,要想到根据开头结尾分类,和看份数的情况。
  2. 把一堆东西分成几份,每份如果可以为空,就要想到星与条问题

代码

#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
const int mod = 998244353;
const int N = 3e6 + 5;
i64 fact[N], infact[N];i64 ksm(i64 a, i64 b){i64 res = 1;while(b){if(b & 1) res = res * a % mod;b >>= 1;a = a * a % mod;}return res;
}i64 C(i64 a, i64 b){if(a < 0 || b < 0 || b > a) return 0; //非法组合数return fact[a] * infact[b] % mod * infact[a - b] % mod;
}int main(){ios::sync_with_stdio(false);cin.tie(nullptr);i64 x1, x2, x3;cin >> x1 >> x2 >> x3;fact[0] = 1, infact[0] = 1; //单独处理0的情况for (int i = 1; i < N; i++){fact[i] = fact[i - 1] * i % mod;}infact[N - 1] = ksm(fact[N - 1], mod - 2);for (int i = N - 2; i >= 1; i--){infact[i] = infact[i + 1] * (i + 1) % mod;}i64 n = x1 + x2 + x3, L = x1 + x3;i64 ans = 0;for (int i = 1; i <= min(x1, x3 + 1); i++){i64 k = 2 * i - 2;ans = (ans + C(x1 - 1, i - 1) * C(x3 - 1, i - 2) % mod * C(n - k, L) % mod) % mod;}for (int i = 1; i <= min(x1, x3); i++){i64 k = 2 * i - 1;ans = (ans + C(x1 - 1, i - 1) * C(x3 - 1, i - 1) % mod * C(n - k, L) % mod * 2 % mod) % mod;}for (int i = 1; i <= min(x1 + 1, x3); i++){i64 k = 2 * i - 2;ans = (ans + C(x1 - 1, i - 2) * C(x3 - 1, i - 1) % mod * C(n - k, L) % mod) % mod;}cout << ans << "\n";
}
http://www.jsqmd.com/news/931498/

相关文章:

  • 仅限首批200家获邀企业接触的Sora 2点云SDK:现在破解其多视角一致性约束算法(含Python可复现伪代码)
  • 如何彻底解决Visual C++运行库缺失问题:新手也能掌握的VisualCppRedist AIO完整指南
  • 自媒体内容工业化:基于AI Skills低代码实现穿搭账号矩阵自动化量产
  • Sora 2如何秒级生成4K多机位足球决赛?:从运动轨迹预测到物理引擎耦合的7层技术栈拆解
  • 植物大战僵尸玩家必看:PVZ Toolkit如何让你轻松掌控游戏全局
  • 三步找回青春记忆:这款数据备份工具让你永久保存QQ空间时光
  • 2026北京配眼镜推荐,有人花冤枉钱有人花得值,核心差在哪 - 配眼镜新资讯
  • STM32F103ZET6用TIM3输出5kHz PWM驱动42步进电机的Keil完整工程
  • MATLAB金融波动率分析工具包:GARCH(1,1)建模、预测与可视化
  • 2026 AI 搜索服务商口碑榜:哪些团队更适合高决策行业 - 企业服务研究所
  • Obsidian研究模板:5分钟打造你的个人科研知识库
  • WRF-CHEM生物排放处理保姆级教程:从MEGAN数据下载到wrfbiochemi文件生成
  • Navicat Mac版无限重置试用期:3种简单方法让你告别14天限制
  • AI 辅助开发引争议:rsync 稳定性与迭代速度的尖锐冲突
  • 食光智语第二次团队作业(原型设计+概要设计) - N
  • 2026-2027多参数水质分析仪源头厂家推荐榜:国产替代深化期的精准选型指南 - 仪表品牌排行榜
  • Sora 2材质生成革命性突破:5步实现从文本描述到UV映射自动对齐,实测兼容Substance Painter 2024.3+
  • 系统架构设计师拿到证书后能加多少工资?市场调研报告
  • AI进化史:工具调用、Skill、MCP、Agent到底有什么关系?
  • ADS里直接跑MATLAB脚本的工具包,带5个实操例子和一步到位配置指南
  • 【题单】wmr
  • 如何用3步实现淘宝任务全自动?这款开源神器让你每天多出1小时
  • 为什么92%的服装设计师还没用上Sora 2?:2024Q2全球TOP50时装周AI应用数据预警
  • 【Sora 2新闻视频制作实战指南】:20年AI媒体专家亲授5大避坑法则与3小时成片工作流
  • 3个技巧优化你的Minecraft体验:PCL2启动器内存管理深度解析
  • 2026 郑州靠谱GEO公司豆包AI搜索推荐榜!(综合实力TOP5) - 星际AI
  • WorkshopDL:无需Steam账号也能下载创意工坊模组的终极解决方案
  • 如何快速将B站缓存视频转换为通用MP4格式:m4s转换器完全指南
  • 西门子S7-1200堆垛机控制工程包:含梯形图程序、HMI图标集、PLC标签与通讯配置文件
  • 终极解决方案:如何一键安装所有Visual C++运行库,告别“缺少dll文件“错误