爱数数的人上大学了,所以计数题就多了
建议先练习好小球与盒子的计数。
(CSP) 前学会求组合数的多种方法,(O(n^2)) 求斯特林数。
省选前学好 (NTT)
计数题首先要知道怎么判断不同,一般都很显然,不显然的话题目里应该也会说。
有的时候需要找找性质,转化一下等价的判别不同的方法。
通常会使用 (DP) 求解,把会造成不同的情况放到数组的,然后考虑不同之间的转移。
经常用到的东西:组合数,斯特林数,NTT等。
组合数
组合数可以用杨辉三角 (n^2) 递推来求,不用考虑模数是否是质数。
当模数是大质数(不会用到大于等于mod的数的阶乘)的时候,可以预处理阶乘及其逆元,然后 (O(1)) 来求。
如果是小质数,可以先预处理小于mod的数的阶乘,然后考虑卢卡斯定理。
如果出题人很毒瘤,模数不是质数,但质因数分解后每个质数的指数都是1,就可以考虑用上边的方法对分解出来的指数求解,然后用中国剩余定理合并答案。例子
如果出题人更毒瘤,模数不是质数,质因数分解后每个质数的指数不一定都是1,那么可以考虑扩展卢卡斯。
斯特林数
分第一类和第二类。常用到第二类,也是小球与盒子的模型的一种。
可以用 (n^2) 递推,不用考虑模数是否是质数。
当模数是 (NTT) 模数的时候,可以用 (NTT) 来求,但通常只用来求第二类斯特林数·行,由 (O(n^2)) 变成了 (O(nlogn))
NTT
常用来优化卷积,有的时候还会用到分治 (NTT) ,分两种,一种是洛谷模板,另一种是多个小多项式合并
错排
设 (ans[i]) 是 (i) 个数的错排问题。
那么考虑第 (i) 放在 (j) 的位置,一共有 (i-1) 种选择。
如果 (j) 放在了 (i) 的位置,那么问题规模缩小 (2) ,有 (ans[i-2]) 种方案。
否则剩下的 (i-1) 个数都有一个不能放的位置,有 (ans[i-1]) 种方案。
所以 (ans[i]= (i-1) imes (ans[i-1]+ans[i-2]))
实在不会的话可以直接背
卡特兰数
有一些神奇的性质。
求法一:(displaystyle f[n]=sum_{i=0}^{n-1}f[i] imes f[n-i-1])
求法二:(displaystyle f[n]=frac{C_{2n}^{n}}{n+1})
应用:括号计数,出栈次序,凸多边形三角划分,二叉搜索树计数。
其他
n个点的无根树有 (n^{n-2}) 种,有根数有 (n^{n-1}) 种,证明需要学习prufer序列的相关知识