ACM中的组合计数题单好题汇总(持续更新中)
前言:
这里会分享一些精妙的组合计数题, 此类题往往需要选择合适的计数集合的划分方式, 有些计数角度的精妙, 个人感觉没有做过相对的题目, 或者是计数感足够犀利, 实在是很难想到正确的角度, 所以这里会汇总一些有趣的计数题, 希望可以帮助到一部分人
ARC168 C - Swap Characters
题意:
给定一个长度为A
, B
, C
的字符串
- 任意交换两个字符
问最后
思路:
乍一看这个条件其实很强劲, 我们可能上来会先想dp, 但是一定不要忘记只含有三种字符这个关键条件
我们将字符串
- 有多少种字符串
, 是可以通过对 进行不超过 次操作得来?
不错! 好像前进了一步, 这样就可以自然地想出下一阶段的问题:
- 字符串
最少经过多少次变换?
那么我们只需要关心对应位置的关系, 我们设
首先如果
结果就会变成
不妨设
综上, 我们找到了将
我们可以枚举
得益于
ABC313 G-Redistribution of Piles
题意:
有
- 对于当前所有的堆, 如果石子数大于0, 就拿走一个放到背包里, 初始时背包为0
- 如果背包内的石子数大于等于
, 就拿出 个石子, 在 堆都放入一个石子
问最后可能的石子序列有多少种, 注意最后背包可以不为空
分析:
如果称第一种操作为A操作, 第二种操作为B操作, 可以发现如果进行一次B操作, 那么之后的一次A操作是没有意义的, 所以可以断言, 操作序列一定是形如A...AB...B的形式
这是一种很常用的技巧!, 我们可以在很多题目中找到类似的技巧, 也就是我们在结果与操作序列之间建立双射关系的时候, 会发现一种结果对应好多种操作序列, 我们会优先选择一种最为简单的操作序列与之建立一一映射
回到正题, 不妨按照石子个数升序排序, 那么根据上述推论, 我们会一直执行A操作, 假设在进行了若干次后停止, 我们可以知道此时一定有一个前缀全0
此时我们枚举变0的位置, 统计当前背包的石子数
(PS: 暴力计算是
CF1096E The Top Scorer
题意:
小明在打比赛,包括小明自己一共有
现在小明已知了自己的得分大于等于
分析:
我们发现其实如果固定小明的分数, 那么整个序列的最大值是确定的, 首先我们枚举小明的分数
分母是通过隔板法算出的方案数, 分子就是枚举的结果, 别忘了同分数的要选择小明, 所以还需要除以
那么问题就是如何计算当前局面的方案数, 我们将问题抽象出来, 其实就是
当前有 个人, 分数和为 , 每个人分数小于等于 的方案数
这就是经典的二项式反演模型, 我们假设
那么
这里要注意, 因为每个人是互不相同的, 所以在计算至少有
然后我们由二项式反演, 可得
自然就有
至此本题解决
有点小心得, 众所周知, 二项式反演有两种形式: (至少 <-> 恰好) 以及 (至多 <-> 恰好)
我个人比较习惯至少, 因为比较自然
其次, "至少"其实就是钦定一部分, 这一部分一定要易于计算, 然后剩下的放任自流, 比如本题如果我们设
ABC215G Colorful Candies 2
题意
现在有
现在高桥君想要在中间选
例如, 选择糖果的颜色是
对于
分析:
这里应该对"拆贡献"这一计数技巧足够敏感, 注意到答案就是:
总的情况其实就是
这个时候反过来考虑每个颜色的贡献, 也就是有多少种情况, 会使得这个颜色产生贡献, 记
上述式子意义就是有多少种选择方式, 使得会选到颜色
因为最多
这个时候有一个很妙的trick, 如果有两种颜色的出现次数一样, 那么他们的贡献一样, 所以我们合并同种出现次数的颜色, 那么这个时候的颜色种类数最多
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)