专题:生成函数与FFT

生成函数与FFT学习笔记

生成函数

一般生成函数(OGF)

定义

对于序列\(a_0,a_1,a_2,...\),构造函数\(G(x)=a_0+a_1x+a_2x^2+...\),称\(G(x)\)为序列\(a_0,a_1,a_2,...\)的生成函数

数字组合问题

问题:

有数字\(1,2,3,4\)。从中取出一些数相加,能够组成哪些数?每个数有几种组合方式?

解法:

数字\(n\)\(0\)个和\(1\)个两种取法,对应的生成函数为\(x^{0\times n}+x^{1\times n}=1+x^{n}\)

我们将数字\(1,2,3,4\)的生成函数相乘,展开得到

\((1+x)(1+x^2)(1+x^3)(1+x^4)=1+x+x^2+2x^3+2x^4+2x^5+2x^6+2x^7+x^8+x^9+x^{10}\)

结果的含义是,有\(1\)种方案可以得到数字\(0,1,2,8,9,10\),有两种方案可以得到\(3,4,5,6,7\)

例如\(6=1+2+3=2+4\)。实质上是求解若干组合对象的笛卡尔积,可以根据多项式乘法的组合意义得到系数与方案数相等。

整数划分问题

问题:

将整数\(n\)划分为若干整数的和,有多少不同的划分方法?

解法:

同理,考虑\((1+x+x^2+...)(1+x^2+x^4+...)(1+x^3+x^6+...)\)的展开式第\(n\)项系数即可。

BZOJ3028 食物

题意:

有若干种物品,每种物品选取的限制如下:

A :偶数个

B :小于等于 1 个

C :小于等于 2 个

D :奇数个

E :4 的倍数个

F:小于等于 4 个

G:小于等于 1 个

H:3 的倍数个

求从中选择 n 个物品的方案数,对10007取模。\(n\le10^{500}\)

题解:

根据题意写出所有物品的生成函数,对于无穷项的用等比数列求和公式合并,计算得到它们的乘积为\(\frac{x}{(1-x)^4}\),如何求出第\(n\)项的系数呢?

多项式的Taylor展开与莱布尼兹公式

我们有Taylor公式:\(f(x)=\sum\limits_{i=0}^{\infty} \frac{f^{(i)}\left(x_{0}\right)}{i !}\left(x-x_{0}\right)^{i}\)

将多项式在\(x=0\)处展开,可以得到第\(n\)项系数为$ \frac{f^{(n)}(0)}{n !}$

我们有莱布尼兹公式:\((u * v)^{(n)}=\sum\limits_{i=0}^{n}\binom{n}{i}u^{(i)} v^{(n-i)}\)

这里代入\(u=x,v=(1-x)^{-4}\)

注意到\(i\ne1\)时有\(u^{(i)}(0)=0\),故\(f^{(n)}(0)=n\times1\times v^{(n-1)}(0)=\frac{n(n+2)!}{3!}\)

故答案为\(\frac{n(n+1)(n+2)}{6}\)

另解:显然\(\frac{x}{(1-x)^4}\)\(n\)次项系数等于\(\frac{1}{(1-x)^4}\)\(n-1\)次项系数

另解:

广义二项式定理

定义\(\binom{a}{k}=\frac{\prod_{i=1}^{k}(a-i+1)}{k !}\),则广义二项式定理成立对任意整数\(a\)成立:\((x+y)^{a}=\sum\limits_{i=0}^{\infty}\binom{a}{i} x^{i} y^{a-i}\)

注意到\(n\)很大,可以读入为字符串然后一位一位取模,并且可以用快速幂求出\(6\)的逆元为\(1668\)

//
// Created by vv123 on 2022/8/9.
//
#include <bits/stdc++.h>
using namespace std;

const int mod = 10007, inv6 = 1668;

int main() {
    string s;
    cin >> s;
    int n = 0;
    for (auto ch : s) {
        n = (n * 10 + ch - '0') % mod;
    }
    cout << n * (n + 1) % mod * (n + 2) % mod * inv6 % mod << "\n";
    return 0;
}

指数型生成函数(EGF)

定义

对于序列\(a_0,a_1,a_2,...\),构造函数\(G(x)=a_0+\frac{a_1}{1!}x+\frac{a_2}{2!}x^2+...\),称\(G(x)\)为序列\(a_0,a_1,a_2,...\)的指数型生成函数

排列问题

问题:

\(n\)种物品,每种物品有\(a_i\)件,问从中取出\(m\)件物品的不同排列数(同种物品被认为是相同的)。

解法:

举例说明,假设物品的多重集为$\left { A,A,B,B,C\right } \(,从中取出两件物品的排列有\)\left { AA,AB,BA,AC,CA,BB,BC,CB\right } $共8种。

我们考虑按照普通生成函数进行计算,得到的结果是将同种物品看作不同物品的组合数,实际答案为该系数乘\(m!\)除以每个物品种类数的阶乘。或者说,设系数为\(p\),答案为\(\frac{p\cdot m!}{t_1!t_2!...t_n!}\),其中\(t_i\)表示第\(i\)种物品取了多少个。

如果我们考虑提前在生成函数中除掉\(t_i!\),则答案为\(p\cdot m!\),可以得到以上例子的指数型生成函数

\(G(x)=(1+\frac{x}{1!}+\frac{x^2}{2!})(1+\frac{x}{1!}+\frac{x^2}{2!}+\frac{x^3}{3!})(1+\frac{x}{1!})\)

如果展开后将\(i\)次项的分母整理为\(i!\),则\(m\)次项的分子则为所求的答案。

BZOJ3456 城市规划

题意:

求 n 个点带标号的连通图个数。 \(n\le10^5\)

题解:

(未完待续)

posted @ 2022-08-09 21:35  _vv123  阅读(105)  评论(0)    收藏  举报