欧拉数学习笔记
欧拉数学习笔记
定义
定义\(\left<\begin{matrix}n\\i\end{matrix}\right>\)为长度为\(n\)的排列\(p\),满足\(p_j<p_{j+1}\)的数目为\(i\)的排列数,也就是欧拉数。
求法
首先可以考虑dp转移\(\left<\begin{matrix}n\\i\end{matrix}\right>\),考虑现在有\(1\sim n-1\),加入\(n\):
- 如果\(n\)加在排列最左边,数目不变,由\(\left<\begin{matrix}{n-1}\\i\end{matrix}\right>\)转移
- 如果\(n\)加在排列最左边,数目增加,由\(\left<\begin{matrix}{n-1}\\{i-1}\end{matrix}\right>\)转移
- 插在某个\(p_j<p_{j+1}\)中间,数目不变,由\(\left<\begin{matrix}{n-1}\\{i}\end{matrix}\right>\times i\)转移
- 插在某个\(p_j>p_{j+1}\)中间,数目增加,由\(\left<\begin{matrix}{n-1}\\{i-1}\end{matrix}\right>\times (n-1-i)\)转移
总转移方程:
但是有些出题人就说了:我计数题都出\(1e5\),你这么递推,我很不满意!
下面给出容斥求法:
设\(\begin{vmatrix}n\\k\end{vmatrix}\)表示长度为\(n\)的排列,至少有\(k\)个\(p_j<p_{j+1}\)的方案数。
二项式反演:
考虑求\(\begin{vmatrix}n\\k\end{vmatrix}\),将小于号连成的两个位置看成一个连通块,那么一共就有\(n-k\)个连通块,那么联通块内部排列只有一种,因为每个连通块不能为空,所以一个连通块的 EGF 就是\(e^x-1\),因为是「至少」,所以两个连通块之间可以随意合并,那么\(\begin{vmatrix}n\\k\end{vmatrix}=n![x^n](e^x-1)^{n-k}\)
把上式用二项式定理拆开:
卷一下就可以求出每个\(\begin{vmatrix}n\\k\end{vmatrix}\)了。
最后我们再 NTT 加速反演就可以求出\(\left<\begin{matrix}n\\k\end{matrix}\right>\)了,总复杂度\(O(n\log n)\)。
但是发现上面的做法还是naive了,发现可以不用卷两遍。
把\(\begin{vmatrix}n\\k\end{vmatrix}=\sum_{i=0}^{n-k}{n-k\choose i} i^n (-1)^{n-k-i}\)直接代回\(\left<\begin{matrix}n\\k\end{matrix}\right>=\sum\limits_{i=k}^n(-1)^{i-k}\dbinom ik\begin{vmatrix}n\\i\end{vmatrix}\),那么有
考虑后面\(\sum_{i=0}^n{i\choose k}{n-i\choose j}\)怎么求。
然后可以\(O(n)\)算出一个\(\left<\begin{matrix}n\\k\end{matrix}\right>\)了(一行减法卷积\(O(n\log n)\))。
应用
CF1349F1 Slime and Sequences (Easy Version)
直接求好序列十分头疼,所以我们建立长度为\(n\)的好序列与长度为\(n\)的排列之间的关联。
对于一个排列\(p\),中的某个\(p_i\),如果\(j\in[1,i)\)中有\(k\)个\(p_{j}<p_{j+1}\),那么\(a_{p_i}=k+1\)。
这样构造的\(p\)与\(a\)一一对应,下面简要证明:
首先\(a\)中的\(1\)肯定放在最前面,且对于\(p\)中极长的前缀\(p_{1...k}\)满足\(p_{i}>p_{i+1},i\in[1,k)\),\(a_{p_{1...k}}=1\),如果我们要填\(2\)的话一定会使得有一个\(1\)在\(2\)前面,\(2,3\)的情况同理。
感性理解一下就好了
对于\(ans_k\)考虑每个位置\(i\)的贡献,那么有
因为不会拉格朗日反演,所以 F2 鸽了。