组合计数复习
联考里面出现了纯推式子题,这方面还需要加强...
只记录知识点,题目看之前写的。有些知识点刚学不久,只挂链接。
有关组合数
二项式定理
\[(x+y)^n=\sum_{k=0}^n\binom{n}{k}x^{n-k}y^k\\
(x+1)^n=\sum_{k=0}^n\binom{n}{k}x^k
\]
可以直接记,也可以考虑组合意义,每个位置可以选x和y,一共选k个x。
恒等式
\[\sum_{r=0}^n \binom{n}{r}=2^n
\]
这个很明显
\[\sum_{r=0}^k \binom{n+r-1}{r}=\binom{n+k}{k}
\]
对角线求和,好像没啥用...组合意义是考虑在\(n+k\)的数集里选\(k\)个数的子集,左边考虑最大值是什么
组合意义
推式子推不出来就多想想组合意义吧
n元素选k项
允许重复选取,n元素选k项建立多重集:考虑用k-1个隔板分开n个1
上面的也是隔板法的式子,即\(x_1+x_2+...+x_n=k\)的非负整数解个数
顺便一提如果要求每份至少一个,方案数为\(\binom{n-1}{k-1}\)
- \(\sum_{k=0}^n\binom{n}{k}^2=\binom{2n}{n}\)
看不透
- \(\binom{a+b}{n}=\sum_{i=0}^n\binom{a}{i}\binom{b}{n-i}\)
两堆数里选n个,枚举每堆选多少
关于斯特林数
第二类斯特林数
= LUB(n个有标号球放进k个无标号盒子,不能有空)
\[\left\{\begin{array}{l}
n \\
k
\end{array}\right\}=\frac{1}{k !} \sum_{j=0}^{k}(-1)^{k-j}\left(\begin{array}{c}
k \\
j
\end{array}\right) j^{n}
\]
考虑容斥,枚举空盒个数,其他无限制
递推式
\[\left\{\begin{array}{c}
n+1 \\
k
\end{array}\right\}=k\left\{\begin{array}{c}
n \\
k
\end{array}\right\}+\left\{\begin{array}{c}
n \\
k-1
\end{array}\right\}
\]
\[\left\{\begin{array}{l}
0 \\
0
\end{array}\right\}=1 \quad \text { and } \quad\left\{\begin{array}{l}
n \\
0
\end{array}\right\}=\left\{\begin{array}{l}
0 \\
n
\end{array}\right\}=0
\]
考虑当前球是否单独放一个盒子
打表快速判断
1 3 1
1 7 6 1
1 15 25 10 1
数学直觉
![](https://cdn.mathpix.com/snip/images/sh8Y8GwyTzKlY6ApeXmbORJSnfPQIR1xqagaMImfjHk.original.fullsize.png)
第一类斯特林数
那么也来说说第一类斯特林数,为n个数放进k个环排列的方案数
递推式
\[\left[\begin{array}{l}
n \\
k
\end{array}\right]=\left[\begin{array}{l}
n-1 \\
k-1
\end{array}\right]+\left[\begin{array}{c}
n-1 \\
k
\end{array}\right] \times(n-1)
\]
多项式系数
\(\left[\begin{array}{l}n \\ k\end{array}\right]\) 为多项式 \(f_{n}(x)=\prod_{i=0}^{n-1}(x+i)=x^{\bar n}\) 的 \(k\) 次项系数,相当于右移一位在加上自己的 (n-1) 倍,参考递推式。
那么我们就可以分治ntt求,还有倍增$n\log n $求一行的
斯特林反演
通常幂转下降幂
这个要记牢,联考D1T2都用到了,好像还是个常见套路...
用斯特林数展开通常幂:
\[n^m = \sum_{i=1}^m\binom{n}{i}i!\left\{\begin{array}{c}m\\i\end{array}\right\}=\sum_{i=0}^m \left\{\begin{array}{c}m\\i\end{array}\right\}n^{\underline i }
\]
证明:考虑组合意义,m个球放n个盒子(均有标号),枚举非空盒个数乘上排列,再乘上第二类斯特林数把球放到这些盒子里。
暴力转是m^2的,nlogn可以多点求值然后卷积
上升幂转通常幂
\[x^{\bar{n}}=\sum_{k}\left[\begin{array}{l}
n \\
k
\end{array}\right] x^{k}
\]
参见第一类斯特林数 - 多项式系数
上升幂和下降幂
\[\begin{array}{l}
x^{n}=(-1)^{n}(-x)^{\bar{n}} \\
x^{\bar{n}}=(-1)^{n}(-x)^{n}
\end{array}
\]
证明就自己展开一下。
那么我们就可以互相带,证明反转公式了。
反转公式
\[\begin{align}
n^{m}&=\sum_{k=0}^{m}\left\{\begin{array}{c}
m \\
k
\end{array}\right\} n^{\underline{k}} \\
&=\sum_{k=0}^{m}\left\{\begin{array}{c}
m \\
k
\end{array}\right\}(-1)^{k}(-n)^{\bar{k}} \\
\end{align}
\]
又由于
\[x^{\bar{n}}=\sum_{k}\left[\begin{array}{c}
n \\
k
\end{array}\right] x^{k} \\
\]
所以
\[\begin{array}{c}
\begin{aligned}
n^{m} &=\sum_{k=0}^{m}\left\{\begin{array}{c}
m \\
k
\end{array}\right\}(-1)^{k}(-n)^{\bar{k}} \\
&=\sum_{k=0}^{m}\left\{\begin{array}{c}
m \\
k
\end{array}\right\}(-1)^{k} \sum_{j=0}^{k}\left[\begin{array}{c}
k \\
j
\end{array}\right](-n)^{j} \\
&=\sum_{j=0}^{m} n^{j} \sum_{k=j}^{m}\left\{\begin{array}{c}
m \\
k
\end{array}\right\}\left[\begin{array}{c}
k \\
j
\end{array}\right](-1)^{k-j}
\end{aligned}
\end{array}
\]
那么显然有
\[\sum_{k=j}^{m}\left\{\begin{array}{c}
m \\
k
\end{array}\right\}\left[\begin{array}{c}
k \\
j
\end{array}\right](-1)^{k-j}=[j=m]
\]
\[\sum_{k=j}^{m}
\left[\begin{array}{c}
m \\
k
\end{array}\right]
\left\{\begin{array}{c}
k \\
j
\end{array}\right\}
(-1)^{k-j}=[j=m]
\]
这些都不用记...
定理
\[\begin{array}{l}
f(n)=\sum_{i=0}^{n}\left\{\begin{array}{l}
n \\
i
\end{array}\right\} g(i) \Longleftrightarrow g(n)=\sum_{i=0}^{n}(-1)^{n-i}\left[\begin{array}{l}
n \\
i
\end{array}\right] f(i) \\
f(x)=\sum_{i=x}^{n}\left\{\begin{array}{l}
i \\
x
\end{array}\right\} g(i) \Longleftrightarrow g(x)=\sum_{i=x}^{n}(-1)^{i-x}\left[\begin{array}{c}
i \\
x
\end{array}\right] f(i)
\end{array}
\]
证明:
\[\begin{aligned}
g(n) &=\sum_{j=0}^{n}(-1)^{n-j}\left[\begin{array}{c}
n \\
j
\end{array}\right] f(j) \\
f(n)&=\sum_{j=0}^{n}[j==n] f(j) \\
&=\sum_{j=0}^{n} \sum_{k=j}^{n}\left\{\begin{array}{l}
n \\
k
\end{array}\right\}\left[\begin{array}{c}
k \\
j
\end{array}\right](-1)^{k-j} f(j) \\
&=\sum_{k=0}^{n}\left\{\begin{array}{l}
n \\
k
\end{array}\right\} \sum_{j=0}^{k}(-1)^{k-j}\left[\begin{array}{l}
k \\
j
\end{array}\right] f(j) \\
&=\sum_{k=0}^{n}\left\{\begin{array}{l}
n \\
k
\end{array}\right\} g(k)
\end{aligned}
\]
跟二项式反演的形式差不多,比较好记。
容斥定理
一般形式
\[\begin{array}{c}
\left|S_{1} \cup S_{2} \cdots \cup S_{n}\right|=\sum_{i}\left|S_{i}\right|-\sum_{i<j}\left|S_{i_{1}} \cap S_{i_{2}}\right|+\sum_{i<j<k}\left|S_{i} \cap S_{j} \cap S_{k}\right|+
\cdots+(-1)^{n}\left|S_{1} \cap S_{2} \cdots \cap S_{n}\right|
\end{array}
\]
比如算满足一些条件,可以容斥算不满足某个集合的条件
推广
对两个关于集合的函数 \(g(S), f(S)\) ,
如果 \(g(S)=\sum_{T \subseteq S} f(T),\) 那么 \(f(S)=\sum_{T \subseteq S}(-1)^{|S|-|T|} g(T)\)
如果 \(g(S)=\sum_{T \supseteq S} f(T),\) 那么 \(f(S)=\sum_{T \supseteq S}(-1)^{|S|-|T|} g(T)\)
二项式反演
把容斥归类了一下,
二项式定理的至多和恰好的转化:
\[f_n = \sum_{i=0}^n {n\choose i} g_i \Leftrightarrow g_n=\sum_{i=0}^n (-1)^{n-i}{n\choose i} f_i
\]
至少和恰好的转化:
\[f_n= \sum_{i=n}^m {i\choose n}g_i\Leftrightarrow g_n=\sum_{i=n}^m(-1)^{i-n}{i\choose n} f_i
\]
这两个是比较有用的,一般看到“恰好"就要直接想到二项式反演。
然后min-max容斥也可以通过二项式反演直接推出来
Min-max容斥
\[\begin{array}{l}
\max (S)=\sum_{T \subseteq S}(-1)^{|T|+1} \min (T) \\
\min (S)=\sum_{T \subseteq S}(-1)^{|T|+1} \max (T)
\end{array}
\]
期望状态下也成立。
k-th max
\[\text{k-th max}(S)=\sum_{T\in S}(-1)^{|T|-k}{{|T|-1}\choose {k-1}}\text{min}(T)
\]
证明可以考虑第i大的数何时能在集合里取到min,显然是和i-1个比它大的在一起的时候,那么枚举比他大的个数带上容斥系数求和,显然只有当i=k的时候才能有1的贡献,那么二项式反演即可。
\[\sum_{j=1}^n {i-1\choose j}f_{j}=[i=k]
\]
线性代数相关
还在啃书...不过先写一些
行列式的值
众所周知,上三角行列式的值等于对角线乘积,我们只需要消成上三角就行了。
矩阵树定理
生成树个数=度数矩阵-邻接矩阵的任意余子式的行列式
关于消元,我们可以利用行列式的性质,一行/一列乘上c再加到另一行/列,行列式的值不变。
注意精度问题,我们每次把开头最大的一行换到当前行来。
变元矩阵树定理
把度数变成权值之和,邻接矩阵变成边(i,j)的权值之和,注意符号。
抽象代数相关
Burnside引理与pólya定理
暂时还没用到过...
置换
置换 \(\sigma\) 是一个从集合 1, \(2, \cdots, n\) 到自身的一一映射
\(
\sigma=\left(\begin{array}{ccccc}
1 & 2 & 3 & \cdots & n \\
a_{1} & a_{2} & a_{3} & \cdots & a_{n}
\end{array}\right)
\)
其中 \(a\) 是一个排列。
置换可以做乘法, 如 \(\left(\begin{array}{c}a \\ b\end{array}\right) *\left(\begin{array}{c}b \\ c\end{array}\right)=\left(\begin{array}{c}a \\ c\end{array}\right)\)
置换群
置换群 𝐺 是一个置换的集合, 并且满足以下条件:
- 封闭性
- 结合律
- 存在唯一单位元
- 存在唯一逆元
染色与等价
有任意置换能使一种染色方案变成另一种时,我们称其等价。
也就是\(\exist f \in G,f*c=d\),c和d等价。
Burnside 引理
定义 \(C(𝑓)\) 为在置换 \(𝑓\) 的作用下不动点的集合
\(N(G)=\frac 1 {|G|}\sum_{f\in G}|C(f)|\)
即等价类数为不动点的平均值。
pólya 定理
在一个有k个循环(轮换)的置换\(f\)中,显然同一循环节要染同一颜色,不同循环节则不影响,那么本质不同的方案数为
\[N(G)=\frac{\sum_{i}^{|G|} m^{c_i}}{|G|}
\]
其中\(c_i\)是\(f_i\)的循环个数
多项式相关
FFT
还是写一下...
把点值\(A(x)=\sum_{i=0}^{n-1}a_i\omega_n^i\)按下标奇偶性分类,右边提出一个x,可以得到
\[\begin{array}{l}
A(x)=\left(a_{0}+a_{2} x^{2}+\ldots+a_{n-2} x^{n-2}\right)+\left(a_{1} x+a_{3} x^{3}+\ldots+a_{n-1} x^{n-1}\right) \\
\quad=\left(a_{0}+a_{2} x^{2}+\ldots+a_{n-2} x^{n-2}\right)+x\left(a_{1}+a_{3} x^{2}+\ldots+a_{n-1} x^{n-2}\right)
\end{array}
\]
那么
\[A(x)=A_1(x^2)+xA_2(x^2)
\]
然后自己推一下式子可以发现:
\[A(\omega_n^k)=A_1(\omega_{\frac n 2}^k)+\omega_n^k A_2(\omega_{\frac n 2}^k)\\
A(\omega_n^k)=A_1(\omega_{\frac n 2}^k)-\omega_n^k A_2(\omega_{\frac n 2}^k)
\]
于是就可以分治了,乘法是DFT成点值后乘起来再IDFT回去,注意IDFT回去的时候要乘\(\frac 1 n\)的系数。
非递归版FFT可以先预处理出递归到底层时的位置,再一路还原上去即可,发现这个位置就是二进制倒过来。
可以巧妙运用指针和预处理单位根使得代码跑得更快、更好写。
NTT
把单位根换成原根!
998244353的原根是3,其他的可以暴力找。
三模NTT
大概是取三个模数然然后CRT,特别麻烦,特别的慢。
MTT
拆系数FFT,https://blog.csdn.net/lvzelong2014/article/details/80156989
比三模NTT快,感觉用不到,考后再学吧
牛顿迭代/各种多项式板子
https://www.cnblogs.com/lcyfrog/p/12783794.html
FWT
https://www.cnblogs.com/lcyfrog/p/12838762.html
单位根反演
https://www.cnblogs.com/lcyfrog/p/11973125.html
拉格朗日插值
https://www.cnblogs.com/lcyfrog/p/11973125.html
生成函数
之前才看过,就放链接吧
%黄队
https://notes.sshwy.name/Math/Polynomial/OGF/
https://notes.sshwy.name/Math/Polynomial/EGF/
https://notes.sshwy.name/Math/Polynomial/Brief-Introduction-to-GF/
概率生成函数 https://www.cnblogs.com/lcyfrog/p/12531033.html
prufer 序列
构造方法:每次删掉一个叶节点,将其父节点加入序列中。一共删n-2次,这样可以保证不重复
性质
- prufer序列与无根树一一对应
- 度数为\(d_i\)的节点在序列中出现\(d_i-1\)次
- n个节点完全图的生成树个数为\(n^{n-2}\)
- 对于一颗无根树,度数序列给出,生成树个数为\(\frac{(n-2)!}{\prod(d_i-1)!}\)
后记
最后几天复习的时候就按照上面的知识点看,有板子敲板子