计数学习小记

0|1前言

闲的无聊懒得做题不如来水点博客。

虽然一直作为一个感性做题的选手,但是理性层面上确实是分析题目初步做法的一个十分重要的方法。

额不会涉及具体的知识点,只是总结点自己做题的时候遇到的比较巧妙的方法。

混沌排版请见谅

还有我也很菜有错误或者不完善的地方见谅/kk

(Polya以后再更新)


1|0正题


1|1基本方法

计数的基本方法来说的话大致能总结为几类

  • dp
  • 组合数学
  • 多项式
  • 其他

dp应该是比较早接触也是花样最多的一类方法,一般需要考虑到状态的设立和优化,方程的转移等部分。

组合数学的话主要通过找出题目的组合意义或者推式子得到。

而多项式一般都是需要使用生成函数,也有可能是简单的卷积。

然而除了上面常见的计数,存在一些其他灵活性的方法,这类的题目一般都能够将整体的计数问题分散到一些小的统计上:比如说SAM进行子串计数的过程。

当然也有可能是假计数(比如实际上可能合法的方案数能够枚举完的)。

不过这里不会赘述上面的几种方法,因为这只是个总结经验的水博客,不是教人计数的博客。


1|2不重

重复问题应该是在正常的计数中最容易遇到的问题,统计重复的方案对做法造成的影响很大,比如来说:

  • 无标号计数:这种一般来说这种是很难的问题,因为一般的计数都需要有一个基准,而这很经常是标号。
  • 统计的不是形成方案的方法,而是方案:很多的生成方法是会生成重复的方案的,当然这个生成方法可能是你自己决定的或者题目给出的。

比较常见的应该就这两种情况了,当我们的计数出现重复的时候就需要考虑换方法来去掉重复或者不计重复的部分。

1|3容斥

啊又是一个很大的专题,当然容斥是有两种作用的,一种是来去掉重复,一种是保证限制的合法。

比如经典的错排问题:
我们可以枚举我们至少有多少个位置是不合法的(设为k个),那么不合法的位置就固定了,答案就是

k=1n(nk)(1)k(nk)!

不难发现容斥的一个好处是我们不需要去统计恰好,而是去固定一些至少,这样可以去掉一些麻烦的限制,这是一个很常见的用处。

容斥还有一个好处是我们的容斥系数可以直接乘在方案中以节省很多的状态(dp来说)。

比如以题目[ARC101C] Ribbons on Tree来说:

n个点之间两两配对,要求配对点之间的路径覆盖整棵树,求方案数对109+7取模
1n5000

额看看我们的限制,每条边都被覆盖至少一次,那么我们容斥来说就是如果钦定k条边不能被覆盖,容斥系数就是(1)k
我们暴力切断不需要覆盖的边,那么设fi,j,k表示以i为根的子树中目前联通块大小为j,已经切断了k条边时的方案。
显然的切断一条边的时候容斥系数成了个1,那么我们完全没有必要用状态记录它,而是直接维护目前的方案×容斥系数的和状态就缩成两维了。

至于很多的反演我认为这不需要在此篇中过多介绍。


1|4寻找基准

基准是一个计数中不可或缺的东西。

拿最简单的过河卒问题来讲,我们询问的兵的路线数量实际上是一个绝对的空间和时间(也就是走的顺序)的路径。

如果问题可以变为询问过河卒的路径能有多少种不同的形状(旋转或者镜像得到的也算重复),那么就是去掉了部分的基准。

而有的问题中基准并不会明显的给出,所以可能正常的计数会导致大量的重漏,此时我们需要寻找一个好的基准来计数。

拿无标号有根数的计数来讲,我们不会算重的原理就是说我们将所有的子树按照一定的规律进行了排序,此时就是确定了一个基准。

例题的话可以看P7888


1|5模型转换

一个很大的话题,大部分的难的计数题都是会有一些十分复杂的条件的,需要找到一个比较简单的条件来替换掉原来的条件。

当然的变换之后不可避免地会有按照新的条件来计的话算重的可能性,此时就需要具体分析了。

1|0奇偶染色

比如[AGC040C]Neither AB nor BA

一个包含A,B,C的序列,每次可以选择相邻的两个除了ABBA的删去。
求有多少个长度为N的序列可以删完。
1N107

经典的奇偶染色,把偶数位置的取反就变为了删除AA/BB然后就很好统计了。

1|0组合数矩阵乘法

最经典的应该是https://www.luogu.com.cn/problem/P3746

(i=0(nkik+r))%p

1n109,0r<k50

其实就是在nk个物品中选出x个物品,要求x%k=r,直接矩阵乘法即可。

而大部分问题可以将组合意义和dp相互转换来转换成快速的矩阵乘法。

1|0期望X计数

有限的期望题都是计数
                                  不是我就对了

但是有时候运用期望的思想会让问题更加的简单。

当然一般这种时候正常的计数也是可行的,只不过一般来说在每一步的总方案数不确定但是概率能确定的情况下我们不妨先算出期望再乘上总共的方案数就能得到答案。

原本有道例题的,但是找不到了/cy

1|0幂次

有时候我们会需要统计答案幂次的和,假设是nk,我们可以将转换为在n个数中选出有序可重的k个数,此时我们就将一个幂次的问题转换为了一个较为复杂的计数。

[NOI2009]管道取珠

给出一个大小为n和一个大小为m的栈,每次选择一个栈弹出栈顶然后记录这个字母,求所有弹出序列的弹出方案的二次方和。
1n,m500

方案的平方可以视为两个人选出同一个序列的方案。
然后dp转移即可。


1|6统计

有的时候计数题不仅需要统计方案数,而是每个方案下某个值的和。

此时我们一般有以下解决方案

  • 使用dp统计:考虑方程是否会存在让某个状态的所有方案的加值的情况,那么此时需要额外记录一个方案数的数组。
  • 组合意义考虑:比如上面的幂次小结中便是用组合意义转化为了一般计数题。
  • 单独考虑单个东西产生的贡献。

1|7好题

不知道写啥了记些好题罢


__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15627306.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(88)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示