当前位置: 首页 > 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.rkmt.cn/news/1442832.html

相关文章:

  • 植物大战僵尸玩家必看:PVZ Toolkit如何让你轻松掌控游戏全局
  • 2026北京配眼镜推荐,有人花冤枉钱有人花得值,核心差在哪 - 配眼镜新资讯
  • Obsidian研究模板:5分钟打造你的个人科研知识库
  • Sora 2材质生成革命性突破:5步实现从文本描述到UV映射自动对齐,实测兼容Substance Painter 2024.3+
  • ADS里直接跑MATLAB脚本的工具包,带5个实操例子和一步到位配置指南
  • 3个技巧优化你的Minecraft体验:PCL2启动器内存管理深度解析
  • 【题单】wmr
  • 为什么92%的服装设计师还没用上Sora 2?:2024Q2全球TOP50时装周AI应用数据预警
  • 2026 郑州靠谱GEO公司豆包AI搜索推荐榜!(综合实力TOP5) - 星际AI
  • 西门子S7-1200堆垛机控制工程包:含梯形图程序、HMI图标集、PLC标签与通讯配置文件
  • PanoHead技术揭秘:三平面生成与体积渲染如何实现360度头部合成
  • 北京配眼镜推荐,配眼镜都去哪,五家店从验光到售后横向对比 - 配眼镜新资讯
  • Android 性能优化【篇五:应用启动分析流程】
  • vue父子组件通信(二)祖先调用provide / inject(1)vue2
  • 3分钟定位热键冲突:Hotkey Detective精准排查方案
  • 网盘直链下载助手:告别限速,实现满带宽下载的终极解决方案
  • C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
  • Meshroom:从照片到3D模型的魔法转换,免费开源工具让创作更简单
  • 2026 温州装修公司避坑指南|选对家装,省心装出理想家 - 速递信息
  • 你的GPU散热真的够吗?深度学习炼丹党必看的温控监控与预警设置指南(以Ubuntu/NVIDIA为例)
  • 3D质感革命:5分钟掌握NormalMap-Online免费在线法线贴图生成器终极指南
  • 2026年只会C语言就业很差吗 C语言真的要完了吗?
  • B站m4s视频转换终极指南:一键将缓存视频转为MP4格式
  • 越南MobiFone MFY99套餐取消全攻略:短信与App双通道详解
  • 保姆级教程:用LeRobot复现斯坦福ALOHA的ACT算法,搞定双臂分拣任务
  • STM32F103RE裸机FTP方案:88W8801 WiFi AP模式 + W25Q128文件存储
  • Anthropic 发布 Claude Code 动态工作流:季度工作几天完成,75 万行代码迁移仅需 11 天!
  • VC++6.0一键打包工具:集成InstallShield向导,自动生成Windows 9x/NT安装包
  • 【硬测_均衡】快速掌握高速信号均衡(FFE,CTLE,DFE)技术
  • 3分钟掌握抖音无水印视频下载:免费开源工具完全指南