EGF

\[\hat{F}(x)=\sum_{n} a_n\frac{x^n}{n!} \]

(全文都是以 EGF 为基础)

封闭形式

\[\sum_{n\ge 1} \frac{x^n}{n!}=e^x \]

  • 这个有关于麦克劳林级数(泰勒展开的一种特殊情况)

泰勒公式

  • \(x\)\(x_0\) 处可导,那么当 \(x\to x_0\) 时,函数的展开式近似于:

\[f(x)=f(x_0)+\frac{f'(x_0)}{1!}x+\frac{f''(x_0)}{2!}x^2... \]

麦克劳林级数是我们在 \(x_0\to 0\) 时的展开,也就是泰勒公式的一个特殊情况

\[\ln(1-x)=\sum_{n=1}^{\infty} -\frac{1}{n}x^n \]

\[\ln(1+x)=\sum_{n=1}^{\infty}\frac{(-1)^{n+1}}{n}x^n \]

排列和圆排列

  • 长度为 \(n\) 的排列数的指数生成函数是

\[P(x)=\sum_{n\ge 0} \frac{n!x^n}{n!}=\frac{1}{1-x} \]

  • 圆排列的定义是排成一个环的方案

  • \(n\) 个数的圆排列方案为 \((n-1)!\)

\[Q(x)=\sum_{n\ge 1} \frac{(n-1)!x^n}{n!}=\sum_{n\ge 1} \frac{x^n}{n}=-\ln(1-x)=\ln (\frac{1}{1-x}) \]

  • 那么 \(\exp(Q(x))=P(x)\)

exp 的直观理解

  • 上述中一个排列的每种方案其实就是将原排列分成若干集合,每种集合组成一种置换环

  • 那么方案数就是每种划分方案后的置换环的方案数的乘积

  • 这个置换环的方案数实际上就是圆排列的方案数

  • 形式化的,假设当前有 \(n\) 个元素,求 \(A\) 的方案数,设生成函数为 \(F(x)\)

  • 每种方案可以对应将 \(n\) 个元素先划分成若干个集合,每个集合 \(B\) 的方案数的乘积,设 \(B\) 的生成函数为 \(G(x)\)

  • 那么 \(\exp(G(x))=F(x)\)

推广

  • 如果 \(n\) 个点 带标号 生成树的 EGF 是 \(G(x)\)\(n\) 个点 带标号 森林的 EGF 是 \(F(x)\) ,那么 \(F(x)=\exp(G(x))\)

  • 如果 \(n\) 个点带标号无向连通图的 EGF 是 \(G(x)\) ,那么 \(n\) 个点带标号无向图的 EGF 是 \(\exp(G(x))\)

应用

长度为 \(n\) 的一个错排指 \(p_i\ne i\)

求错排的指数生成函数

  • 从置换环的角度来看,实际上就是不存在长度为 1 的置换环,生成函数 \(G(x)=\sum_{n\geq 2 } \frac{x^n}{n}=\ln (\frac{1}{1-x})-x\)

  • 那么错排的生成函数是 \(\exp(G(x))\)

求有多少个映射 \(f:\{1,2,...,n\} \to \{1,2,...,n\}\) ,使得

任意一个 \(i\) 映射 \(k\) 次后等于映射 \(k-1\) 次后映射的数是同一个数

  • 考虑将 \(i\)\(f_i\) 连边。相当于我们从任意一个 \(i\)\(k\) 步和走 \(k-1\) 步到达的是同一个点

  • 那么整个图就是一些带一个自环的基环树组成的,且环的深度不超过 \(k\) ,假设根的深度为 \(1\)

  • 我们将环当成根,把边的方向反一下,那么整个图可以当成一些深度不超过 \(k\) 的生成树组成的

  • 假设深度不超过 \(k\) 的生成树的方案数的生成函数为 \(F_k(x)\)

  • 实际上深度不超过 \(k\) 的生成树就是用一个节点将深度不超过 \(k-1\) 的森林连起来

  • 那么 \(F_k(x)=x\exp(F_{k-1}(x))\)

  • 答案是 \([x^n]\exp (F_k(x))\)

给一个 \(n\) 个数的序列 \(a_1,a_2,...,a_n\) ,和初值为 0 的变量 \(s\) ,要求你重复一下操作 \(k\)

  • \(1,2,...,n\) 中等概率选择一个 \(x\)
  • \(s\) 加上 \(\Pi_{i\ne x} a_i\)
  • \(a_x\) 减一

\(k\) 次操作后 \(s\) 的期望

\(1\leq n \leq 5000,1\leq k\leq 10^9,0\leq a_i\leq 10^9\)

  • 首先随便减两个数,发现最终的结果和减的顺序没有关系

  • 那么我们将一个数所有的减操作放在一起,再归纳一下,设每个数减少 \(b_i\),可以得出

\[s=\prod_{i=1}^n a_i -\prod_{i=1}^n (a_i-b_i) \]

  • 那么我们的问题就转换成了 \(\prod_{i=1}^n (a_i-b_i)\) 的期望

  • 考虑计算每种方案的 \(\prod_{i=1}^n(a_i-b_i)\) 的和,最后除 \(n^k\)

  • \(k\) 次序列中,要使得 \(i\) 出现 \(b_i\) 次的方案数是

\[\frac{k!}{b_1!b_2!...b_n!} \]

  • 这和指数生成函数的系数类似

  • \(a_j\) 的指数生成函数是

\[F_j(x)=\sum_{i\ge 0} (a_j-i)\frac{x^i}{i!} \]

  • 那么答案就是 \([x^k]\prod_{j=1}^nF_j(x)\)

  • 为了快速计算答案,我们需要将 \(F_j(x)\) 转换成封闭形式

  • \(F_j(x)=a_je^x-xe^x=(a_j-x)e^x\)

  • \(\prod_{j=1}^n F_j(x)=e^{nx}\prod_{j=1}^n(a_j-x)\)

  • \(\prod_{j=1}^n (a_j-x)\) 是个 \(n\) 次多项式,可以暴力算,假设展开式是 \(\sum_{i=0}^n c_ix^i\) ,那么

\[\begin{aligned} \prod_{j=1}^n F_j(x)&=(\sum_{i\ge 0}\frac{n^ix^i}{i!})(\sum_{i=0}^n c_ix^i)\\ &=\sum_{i\ge 0}\sum_{j=0}^i c_jx^j\frac{n^{i-j}x^{i-j}}{(i-j)!}\\ &=\sum_{i\ge0}\frac{x^i}{i!}\sum_{j=0}^i n^{i-j}i^{\underline{j}}c_j \end{aligned} \]

  • 答案就是这个多项式 \(x^k\) 的系数
posted @ 2022-06-04 11:25  Kzos_017  阅读(78)  评论(0编辑  收藏  举报