不严谨 GF 笔记

Xie Zheyuan / 2024-04-23 / 原文

不严谨 GF 笔记

前置知识

Maclaurin 展开式

Maclaurin 展开式利用多阶导数逼近,可以将一个函数展开成一个无穷级数的形式,公式如下:

\[f(x)=\sum_{k=0}^{+\infty}\frac{f^{(k)}(0)}{k!}x^k \]

常用公式:

\[\begin{aligned} &e^x=\sum_{k=0}^{+\infty}\frac{x^k}{k!}\\ &\frac{1}{1-x}=\sum_{k=0}^{+\infty}x^k \end{aligned} \]

前一个用于 EGF,后一个用于 OGF。

广义二项式定理

广义二项式系数:

\[\binom{m}{n}=\frac{1}{n!}\prod_{k=0}^{n-1}m-k \]

要求 \(n\in\mathbb{N},m\in\mathbb{R}\)

同理还有广义二项式定理:

\[(x+y)^n=\sum_{k=0}^{+\infty}\binom{n}{k}x^{n-k}y^k \]

上指标反转,用于将上面的数转成正数:

\[\binom{n}{m}=(-1)^m\binom{m-n-1}{m} \]

普通生成函数

概述

数列 \(A_0,A_1,\cdots,A_\infty\) 的普通生成函数(OGF)为:

\[\sum_{k=0}^{+\infty}A_kx^k \]

例题 1

炸串店有 \(5\) 种素菜,\(3\) 种荤菜,奶茶店有 \(2\) 种奶茶。ytxy 要请我吃饭,求凑出 \(6\) 个菜的方案数(素菜与素菜、荤菜与荤菜、奶茶与奶茶之间互不区分)。

通过简单的手摸或者背包问题,可以知道答案是 \(11\)。我们考虑用普通生成函数的思想去理解这个问题。

对于素菜,我们构造数列 \(A=\{1,1,1,1,1,1,0,\cdots\}\),其生成函数为 \(F=x^5+x^4+x^3+x^2+x+1\)

对于荤菜,我们构造数列 \(B=\{1,1,1,1,0,\cdots\}\),其生成函数为 \(G=x^3+x^2+x+1\)

对于奶茶,我们构造数列 \(C=\{1,1,1,0,\cdots\}\),其生成函数为 \(H=x^2+x+1\)

然后我们考虑计算出 \(I=F\times G\times H\)

\[I=x^{10} + 3 x^{9} + 6 x^{8} + 9 x^{7} + 11 x^{6} + 12 x^{5} + 11 x^{4} + 9 x^{3} + 6 x^{2} + 3 x + 1 \]

然后我们发现 \(x^6\) 的系数(下面记作 \([x^6]I\))就是答案。

为什么呢?考虑多项式乘法的过程,凑出 \(x^6\) 其实就是在 \(F\) 中选一个指数 \(i\)\(G\) 中选出一个指数 \(g\)\(H\) 中选出一个指数 \(h\),使得 \(i+g+h=6\),这和我们暴力凑数的思想是一样的。

例题 2

Link

考虑计算每种食物的普通生成函数,然后将其乘起来找第 \(n\) 项系数:

承德汉堡:偶数个:\(\{1,0,1,0,\cdots\}\),生成函数为:

\[\sum_{k=0}^{+\infty}x^{2k} \]

发现这是一个无穷级数的形式处理不方便,但是我们发现它的封闭形式为:

\[\frac{1}{1-x^2} \]

所以我们就用这个形式来表达它的普通生成函数。

可乐:\(0\) 个或 \(1\) 个:\(\{1,1,0,0,\cdots\}\),生成函数为:

\[x+1 \]

鸡腿:\(0\sim2\) 个:\(\{1,1,1,0,0,\cdots\}\),生成函数为:

\[x^2+x+1 \]

蜜桃多:奇数个:\(\{0,1,0,1,\cdots\}\),生成函数为:

\[\sum_{k=0}^{+\infty}x^{2k+1}=x\sum_{k=0}^{+\infty}x^{2k}=\frac{x}{1-x^2} \]

鸡块:\(4\) 的倍数个:\(\{1,0,0,0,1,0,\cdots\}\),生成函数为:

\[\sum_{k=0}^{+\infty}x^{4k}=\frac{1}{1-x^4} \]

包子:\(0\sim3\) 个:\(\{1,1,1,1,0,0,\cdots\}\),生成函数为:

\[x^3+x^2+x+1 \]

土豆片炒肉:不超过一个:\(\{1,1,0,0,\cdots\}\),生成函数为:

\[x+1 \]

面包:\(3\) 的倍数个:\(\{1,0,0,1,0,\cdots\}\),生成函数为:

\[\sum_{k=0}^{+\infty}x^{3k}=\frac{1}{1-x^3} \]

我们将这些乱七八糟的东西乘起来,得到:

\[\begin{aligned} &(\frac{1}{1-x^2})(x+1)(x^2+x+1)(\frac{x}{1-x^2})(\frac{1}{1-x^4})(x^3+x^2+x+1)(x+1)(\frac{1}{1-x^3})\\ &=\frac{x}{x^{4} - 4 x^{3} + 6 x^{2} - 4 x + 1}\\ &=\frac{x}{(x-1)^4} \end{aligned} \]

然后我们将这个东西展开,你可以广义二项式定理,当然也可以直接展开。但是直接展开太麻烦了,我们还是广义二项式定理吧:

\[\begin{aligned} &\frac{x}{(x-1)^4}\\ &=x(x-1)^{-4}\\ &=x\sum_{k=0}^{+\infty}\binom{-4}{k}x^{k}(-1)^{-4-k}\\ &=x\sum_{k=0}^{+\infty}(-1)^k\binom{k+3}{k}x^k(-1)^{-4-k}\\ &=x\sum_{k=0}^{+\infty}\binom{k+3}{k}x^k\\ &=\sum_{k=1}^{+\infty}\binom{k+2}{k-1}x^k\\ &=\sum_{k=1}^{+\infty}\frac{1}{6}k(k+1)(k+2)x^k \end{aligned} \]

所以答案就是 \(\frac{1}{6}k(k+1)(k+2)\)

指数生成函数

概述

数列 \(A_0,A_1,\cdots,A_\infty\) 的指数生成函数(EGF)为:

\[\sum_{k=0}^{+\infty}\frac{x^k}{k!}A_k \]

例题 1

有红绿蓝三种彩灯,红色彩灯共三个,绿色彩灯共四个,蓝色彩灯共两个,求选出 \(6\) 个彩灯摆成一排的方案数。(同种颜色的彩灯之间互不区分)

可以写一个程序,枚举所有情况,计算答案应该是 \(410\) 个。

我们发现这和前面的问题区别在于不同物品之间存在顺序。无法使用普通生成函数。

我们考虑构造指数生成函数。

红色彩灯的数列是 \(\{1,1,1,1,0,\cdots\}\),其指数生成函数为:

\[A=\frac{1}{6}x^3+\frac{1}{2}x^2+x+1 \]

同理,绿色彩灯的数列是 \(\{1,1,1,1,1,0,\cdots\}\),其指数生成函数为:

\[B=\frac{1}{24}x^4+\frac{1}{6}x^3+\frac{1}{2}x^2+x+1 \]

同理,蓝色的数列是 \(\{1,1,1,0,\cdots\}\),其指数生成函数为:

\[C=\frac{1}{2}x^2+x+1 \]

考虑计算 \(I=A\times B\times C\)。答案为:

\[\frac{x^{9}}{288} + \frac{x^{8}}{32} + \frac{23 x^{7}}{144} + \frac{41 x^{6}}{72} + \frac{3 x^{5}}{2} + \frac{71 x^{4}}{24} + \frac{13 x^{3}}{3} + \frac{9 x^{2}}{2} + 3 x + 1 \]

改成指数生成函数的形式:

\[1+3x+\frac{9}{2!}x^2+\frac{13}{3!}x^3+\frac{71}{24}x^4+\frac{180}{5!}x^5+\frac{410}{6!}x^6+\frac{805}{7!}x^7+\frac{1260}{8!}x^8+\frac{1260}{9!}x^{9} \]

可以发现 \(x^6\) 的系数就是 \(\frac{410}{6!}\) 和答案吻合。

为什么呢?

考虑一个最简单的问题,有 \(n\) 个格子,我们将其 \(m\) 个位置涂黑,这方案数应该是 \(\binom{n}{m}\),而我们统一除上阶乘就不用这个二项式系数了。

大概就是这样的一个意思。

例题 2

用红蓝绿 \(3\) 种颜色去涂 \(1\times n\) 的棋盘,每格涂一种颜色,求使得被涂成红色和蓝色的方格数均为偶数的的涂色方法数。

考虑红色和蓝色,数列为 \(\{1,0,1,0,\cdots\}\),生成函数为:

\[\begin{aligned} &\sum_{k=0}^{+\infty}\frac{x^{2k}}{(2k)!}\\ &=\frac{1}{2}\left(\sum_{k=0}^{+\infty}\frac{x^k}{k!}+\sum_{k=0}^{+\infty}\frac{(-x)^k}{k!}\right)\\ &=\frac{e^x+e^{-x}}{2} \end{aligned} \]

而绿色,数列为 \(\{1,1,1,\cdots\}\),生成函数为:

\[\begin{aligned} &\sum_{k=0}^{+\infty}\frac{x^k}{k!}\\ &=e^x \end{aligned} \]

所以答案的生成函数为:

\[\begin{aligned} &e^x\left(\frac{e^x+e^{-x}}{2}\right)^2\\ &=\frac{1}{4}e^x\left(e^{2x}+e^{-2x}+2\right)\\ &=\frac{1}{4}(e^{3x}+2e^{x}+e^{-x})\\ &=\sum_{k=0}^{+\infty}\frac{(-1)^n+3^n+2}{4}\cdot\frac{x^k}{k!} \end{aligned} \]

所以答案便是 \(\frac{(-1)^n+3^n+2}{4}\)

课后作业:试证明 \(m=\frac{(-1)^n+3^n+2}{4}\),对于 \(n\in\mathbb{N}\) 而言,\(m\in\mathbb{Z}^{+}\)

单位根反演

前置知识

复数、单位根、等比数列求和公式。

概述

虽然说单位根反演本身和生成函数关系没有那么紧密,但是在一些毒瘤题目(比如白兔之舞)是有应用的。

基本公式:

\[[n\mid m]=\frac{1}{n}\sum_{k=0}^{n-1}\omega_n^{mk} \]

Proof:

  • \(m\equiv0\pmod{n}\),那么 \(\omega_n^{mk}=1\),所以原式为 \(\frac{1}{n}\times n = 1\)
  • \(m\not\equiv0\pmod{n}\),那么我们利用等比数列求和公式得到后面的求和式为 \(1\times\frac{1-\omega_n^{mn}}{1-\omega_n^{m}}\),由于 \(\omega_n^{mn}=1\),所以后面的求和式等于 \(0\),所以原式等于 \(0\)

常见形式

\[\sum_{k=0}^{m}[n\mid k]f_k=\frac{1}{n}\sum_{k=0}^{m}f(\omega_n^k) \]

其中 \(f\) 为多项式。

证明是平凡的,读者不难自证。

习题(无多项式篇)

BZOJ 3028. 食物

就是 OGF 的例题 2。只需要注意读入 \(n\) 的时候需要顺便取模。

Code

P2000 拯救世界

OGF 练习题。

先考虑 kkk。

金神石的块数必须是 \(6\) 的倍数;

\[\frac{1}{1-x^6} \]

木神石最多用 \(9\) 块;

\[x^9+x^8+x^7+x^6+x^5+x^4+x^3+x^2+x+1 \]

水神石最多用 \(5\) 块;

\[x^5+x^4+x^3+x^2+x+1 \]

火神石的块数必须是 \(4\) 的倍数;

\[\frac{1}{1-x^4} \]

土神石最多用 \(7\) 块。

\[x^7+x^6+x^5+x^4+x^3+x^2+x+1 \]

然后是 lzn:

金神石的块数必须是 \(2\) 的倍数;

\[\frac{1}{1-x^2} \]

木神石最多用 \(1\) 块;

\[x+1 \]

水神石的块数必须是 \(8\) 的倍数;

\[\frac{1}{1-x^8} \]

火神石的块数必须是 \(10\) 的倍数;

\[\frac{1}{1-x^{10}} \]

土神石最多用 \(3\) 块。

\[x^3+x^2+x+1 \]

然后丧心病狂地将这些东西全部乘起来就好了,得到:

\[\begin{aligned} &- \frac{1}{x^{5} - 5 x^{4} + 10 x^{3} - 10 x^{2} + 5 x - 1}\\ &=\frac{1}{(1-x)^5}\\ &=(1-x)^{-5}\\ &=\sum_{k=0}^{+\infty} \binom{-5}{k}(-x)^k\\ &=\sum_{k=0}^{+\infty}(-1)^k\binom{k+4}{k}(-1)^kx^k\\ &=\sum_{k=0}^{+\infty}\binom{k+4}{k}x^k \end{aligned} \]

所以答案是 \(\binom{n+4}{n}\)。至于高精度,用 python 即可。注意如果用默认的 int​ 会炸,要用 decimal.Decimal​。

Submission

HDU-2065 "红色病毒"问题

EGF 练习题。

A,C 都要求出现偶数次,生成函数为:

\[\sum_{k=0}^{+\infty}\frac{x^{2k}}{k!}=\frac{e^x+e^{-x}}{2} \]

B,D 无特殊限制,生成函数为:

\[\sum_{k=0}^{+\infty}\frac{x^k}{k!}=e^x \]

所以答案的生成函数为:

\[\begin{aligned} &e^{2x}\left(\frac{e^x+e^{-x}}{2}\right)^2\\ &=\frac{1}{4}e^{2x}(e^{2x}+e^{-2x}+2)\\ &=\frac{1}{4}(e^{4x}+2e^{2x}+1)\\ &=\frac{1}{4}+\frac{1}{4}\left(\sum_{k=0}^{+\infty}(4^k+2^{k+1})\frac{x^k}{k!}\right) \end{aligned} \]

所以答案便是 \(\frac{1}{4}(4^k+2^{k+1})=4^{k-1}+2^{k-1}\)

Submission

P2012 拯救世界2

题号好评!

对于乾、坎、艮、震,只能出现奇数次,即:

\[\sum_{k=0}^{+\infty}\frac{x^{2k+1}}{(2k+1)!}=\frac{e^x-e^{-x}}{2} \]

对于坤、兑、离、巽,只能出现偶数次,即:

\[\sum_{k=0}^{+\infty}\frac{x^{2k}}{(2k)!}=\frac{e^x+e^{-x}}{2} \]

对于 A、C、T、G,无特殊限制,即:

\[\sum_{k=0}^{+\infty}\frac{x^k}{k!}=e^x \]

所以答案的生成函数就是:

\[\begin{aligned} &e^{4x}\left(\frac{e^x-e^{-x}}{2}\right)^4\left(\frac{e^x+e^{-x}}{2}\right)^4\\ &=\frac{1}{256}e^{4 x} (e^x - e^{-x})^4 (e^{-x} + e^x)^4\\ &=\frac{1}{256}\left(-4 + e^{-4 x} + 6 e^{4 x} - 4 e^{8 x} + e^{12 x}\right)\\ &=-\frac{1}{64}+\frac{1}{256}(e^{-4x}+6e^{4x}-4e^{8x}+e^{12x})\\ &=-\frac{1}{64}+\frac{1}{256}\sum_{k=0}^{+\infty}((-4)^k+6\cdot4^k-4\cdot8^k+12^k)\frac{x^k}{k!} \end{aligned} \]

所以答案就是:

\[\begin{aligned} &\frac{(-4)^k+6\cdot4^k-4\cdot8^k+12^k}{256}\\ &=3\times2^{2 k - 7}- 2^{3 k - 6}+ (-1)^k 4^{k - 4} + 3^k 4^{k - 4} \end{aligned} \]

这道题数据范围特别大,朴素快速幂好像不是很能过的样子,而模数又不是质数,可以使用扩展欧拉定理优化,并且使用光速幂。

最后一堆细节处理,但是本题并不卡常。

Submission

P4451 [国家集训队] 整数的lqp拆分

首先考虑如果对于每一个 \(a_i=i\) 构造一个生成函数是极其不现实的。

我们考虑设斐波那契数列 \(f\) 的生成函数为 \(F(x)\),则容易发现恰好取 \(k\) 个的生成函数是 \(F^k(x)\)。则本题我们可以枚举这个 \(k\),答案的生成函数为:

\[\sum_{k=0}^{+\infty}F^k(x)=\frac{1}{1-F(x)} \]

然后考虑我们怎么计算 \(F(x)\)。感兴趣自己在网上找推导:

\[F(x)=\frac{x}{1-x-x^2} \]

好,记住这个结论,我们继续。

则答案的生成函数为:

\[\frac{x^2 + x - 1}{x^2 + 2 x - 1} \]

好,这玩意怎么展开呢?

我不太会,所以我们直接找一个网站来帮我们算,最后结论为:

\[\frac{x^2 + x - 1}{x^2 + 2 x - 1}=\sum_{k=0}^{+\infty}\frac{-(1-\sqrt{2})^n+(1+\sqrt{2})^n}{2\sqrt{2}}x^n \]

好,然后我们发现 \(2\) 存在模 \(10^9+7\) 意义下的逆元(\(59713600\)),所以这道题就做完了。

答案为:

\[\frac{-(1-\sqrt{2})^n+(1+\sqrt{2})^n}{2\sqrt{2}} \]

Submission

习题(含多项式篇)

前言

由于 FFT/NTT 已经滚出了 NOI,仅在 CTS 上出现。但是如果有更好解法,出题人就会使用更好做法。所以很多 GF 题目都需要用到多项式重工业。

所以建议大家找一个好看的板子就行。

当然也可以像我一样随便乱写点东西。

总之,无论是你抄板子还是自己写,请通过下面的题目:

  1. P3803 【模板】多项式乘法(FFT)
  2. P4238 【模板】多项式乘法逆
  3. P5205 【模板】多项式开根
  4. P4725 【模板】多项式对数函数(多项式 ln)
  5. P4726 【模板】多项式指数函数(多项式 exp)

由于考虑到可能写不完所有的板子,所以我会在每道题之前加上本题需要的多项式重工业编号。

(1) UVA12298 Super Poker II

首先考虑对于每一个花色我们建一个生成函数,合数项是 \(1\),质数项是 \(0\),将丢失的牌所在的系数设为 \(0\),然后就是一个多项式乘法找系数。

我选择的模数是 \(2061584302081\),原根是 \(377\),原根逆元是 \(596054877790\)。可以参考的一个质数表