组合计数复习

组合计数复习

联考里面出现了纯推式子题,这方面还需要加强...

只记录知识点,题目看之前写的。有些知识点刚学不久,只挂链接。

有关组合数

二项式定理

\[(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\)个数的子集,左边考虑最大值是什么

组合意义

推式子推不出来就多想想组合意义吧

  • \(\binom{n}{k}\)

n元素选k项

  • \(\binom{n+k-1}{k-1}\)

允许重复选取,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

数学直觉

第一类斯特林数

那么也来说说第一类斯特林数,为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)\)

置换群

置换群 𝐺 是一个置换的集合, 并且满足以下条件:

  1. 封闭性
  2. 结合律
  3. 存在唯一单位元
  4. 存在唯一逆元
染色与等价

有任意置换能使一种染色方案变成另一种时,我们称其等价。

也就是\(\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次,这样可以保证不重复

性质

  1. prufer序列与无根树一一对应
  2. 度数为\(d_i\)的节点在序列中出现\(d_i-1\)
  3. n个节点完全图的生成树个数为\(n^{n-2}\)
  4. 对于一颗无根树,度数序列给出,生成树个数为\(\frac{(n-2)!}{\prod(d_i-1)!}\)

后记

最后几天复习的时候就按照上面的知识点看,有板子敲板子

posted @ 2020-06-22 10:22  lcyfrog  阅读(340)  评论(0编辑  收藏  举报