不严谨 GF 笔记

不严谨 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\)可以参考的一个质数表

posted @ 2024-04-23 12:27  xiezheyuan  阅读(42)  评论(0)    收藏  举报