组合数学进阶笔记

组合数学进阶

生成函数

生成函数及母函数。一共分为两类:普遍性函数、指数性函数。

普遍性函数

对于序列 a 0 , a 1 , a 2 , … a_0,a_1,a_2,\dots a0,a1,a2,,定义 G ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n x n … \displaystyle G(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n\dots G(x)=a0+a1x+a2x2+a3x3++anxn 则称 G ( x ) \displaystyle G(x) G(x) 是数列的生成函数。

指数性函数

生成函数是说,构造这么一个多项式函数 g ( x ) g(x) g(x),使得 x x x n n n 次方系数为 f ( n ) f(n) f(n)

举个例子最清晰:

问: x 1 + x 2 + ⋯ + x k = n x_1+x_2+\dots+ x_k=n x1+x2++xk=n
问有多少种非负整数解?

解:令 G ( x ) = a 0 + a 1 x + a 2 x 2 + a 3 x 3 + ⋯ + a n x n … G(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n\dots G(x)=a0+a1x+a2x2+a3x3++anxn

那么把题转化为 G k ( x ) G^k(x) Gk(x) n n n 次项的系数。

G ( x ) = 1 1 − x ( x < 1 ) \displaystyle G(x)=\frac{1}{1-x}(x < 1) G(x)=1x1(x<1)

加一点小知识:

( n k ) = n ( n − 1 ) ( n − 2 ) … ( n − k + 1 ) k ! \displaystyle\left(\begin{matrix}n \\k\end{matrix}\right)=\frac{n(n-1)(n-2)\dots(n-k+1)}{k!} (nk)=k!n(n1)(n2)(nk+1) 对于当 n n n 为负数或小数时一样适用

运用二项式展开:

n n n 次项系数为 ( − n k ) \displaystyle\left(\begin{matrix}-n \\k\end{matrix}\right) (nk),根据组合数定义: n n n 次项系数为 ( n + k − 1 k − 1 ) \displaystyle\left(\begin{matrix}n+k-1 \\k-1\end{matrix}\right) (n+k1k1)

P3711 仓鼠的数学题

S k ( x ) = ∑ i = 0 x i k \displaystyle S_k(x)=\sum\limits_{i=0}^{x}i^k Sk(x)=i=0xik,给定正整数 n n n 和序列 a a a,求: ∑ k = 0 n S k ( x ) a k \displaystyle \sum\limits_{k=0}^{n}S_k(x)a_k k=0nSk(x)ak

数据范围: 1 ≤ n ≤ 2 × 1 0 5 1\leq n\leq 2\times 10^5 1n2×105

解:

假设 S k ( x ) = ∑ i = 0 x − 1 i k \displaystyle S_k(x)=\sum\limits_{i=0}^{x-1}i^k Sk(x)=i=0x1ik,之后只要把所有的 x x x 换成 x + 1 x+1 x+1 即可,那么有

S k ( x ) = 1 k + 1 ∑ i = 0 k ( k + 1 i ) B i x k + 1 − i \displaystyle S_k(x)=\frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i}B_{i}x^{k+1-i} Sk(x)=k+11i=0k(ik+1)Bixk+1i

这个并不是很好看,所以考虑枚举 k − i k-i ki

S k ( x ) = 1 k + 1 ∑ i = 0 k ( k + 1 k − i ) B k − i x i + 1 \displaystyle S_k(x)=\frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{k-i}B_{k-i}x^{i+1} Sk(x)=k+11i=0k(kik+1)Bkixi+1

利用二项式的对称性:

S k ( x ) = 1 k + 1 ∑ i = 0 k ( k + 1 i + 1 ) B k − i x i + 1 \displaystyle S_k(x)=\frac{1}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i+1}B_{k-i}x^{i+1} Sk(x)=k+11i=0k(i+1k+1)Bkixi+1

于是答案为

∑ k = 0 n a k k + 1 ∑ i = 0 k ( k + 1 i + 1 ) B k − i x i + 1 \displaystyle \sum\limits_{k=0}^{n}\frac{a_k}{k+1}\sum\limits_{i=0}^{k}\binom{k+1}{i+1}B_{k-i}x^{i+1} k=0nk+1aki=0k(i+1k+1)Bkixi+1

显然交换求和顺序

∑ i = 0 n x i + 1 ∑ k = i n a k k + 1 ( k + 1 i + 1 ) B k − i \displaystyle \sum\limits_{i=0}^{n}x^{i+1}\sum\limits_{k=i}^{n}\frac{a_k}{k+1}\binom{k+1}{i+1}B_{k-i} i=0nxi+1k=ink+1ak(i+1k+1)Bki

拆掉二项式

∑ i = 0 n x i + 1 ( i + 1 ) ! ∑ k = i n a k k ! B k − i ( k − i ) ! \displaystyle \sum\limits_{i=0}^{n}\frac{x^{i+1}}{(i+1)!}\sum\limits_{k=i}^{n}a_kk!\frac{B_{k-i}}{(k-i)!} i=0n(i+1)!xi+1k=inakk!(ki)!Bki

直接减法卷积即可,但是这里的 x x x 实际上是 x + 1 x+1 x+1,于是我们考虑下面的问题,求

∑ i = 0 n f i ( x + 1 ) i \displaystyle \sum\limits_{i=0}^{n}f_i(x+1)^i i=0nfi(x+1)i

直接利用二项式定理:

∑ i = 0 n f i ∑ j = 0 i ( i j ) x j \displaystyle \sum\limits_{i=0}^{n}f_i\sum\limits_{j=0}^{i}\binom{i}{j}x^j i=0nfij=0i(ji)xj

交换求和顺序之后减法卷积即可。

Burnside引理、Polya定理

1.置换

置换简单来说就是对元素进行重排列,举个例子 [ 1 , n ] [1,n] [1,n] 的置换是
( 1 2 3 … n a 1 a 2 a 3 … a n ) \left( \begin{matrix} 1&2&3&\dots&n \\ a_1&a_2&a_3&\dots&a_n \end{matrix} \right) (1a12a23a3nan)

其中 a 1 , a 2 , … a n a_1,a_2,\dots a_n a1,a2,an 就是对 1 , 2 , … n 1,2,\dots n 1,2,n 的新排列

其实就是

#define 1 a_1
#define 2 a_2
...

2.Burnside引理

D ( a j ) D(a_j) D(aj) 表示在置换 a j a_j aj 下不变的元素的个数。 L L L 表示本质不同的方案数。

L = 1 ∣ G ∣ ∑ j = 1 s D ( a j ) \displaystyle L=\frac{1}{|G|}\sum^{s}_{j=1}D(a_j) L=G1j=1sD(aj)

对于刚才那个例子在 N = 4 N=4 N=4 的情况下的四种置换:
( 1 2 3 4 1 2 3 4 ) ( 1 2 3 4 2 3 4 1 ) ( 1 2 3 4 3 4 1 2 ) ( 1 2 3 4 4 1 2 3 ) \left( \begin{matrix} 1&2&3&4 \\ 1&2&3&4 \end{matrix} \right) \left( \begin{matrix} 1&2&3&4 \\ 2&3&4&1 \end{matrix} \right) \left( \begin{matrix} 1&2&3&4 \\ 3&4&1&2 \end{matrix} \right) \left( \begin{matrix} 1&2&3&4 \\ 4&1&2&3 \end{matrix} \right) (11223344)(12233441)(13243142)(14213243)

所有方案在置换 a 1 a_1 a1 下都不变, D ( a 1 ) = 16 D(a_1)=16 D(a1)=16

X X X X XXXX XXXX E E E E EEEE EEEE 在置换 a 2 a_2 a2 下都不变, D ( a 2 ) = 2 D(a_2)=2 D(a2)=2

X X X X XXXX XXXX E E E E EEEE EEEE 以及 X E X E XEXE XEXE E X E X EXEX EXEX 在置换 a 3 a_3 a3 下不变, D ( a 3 ) = 4 D(a_3)=4 D(a3)=4

X X X X XXXX XXXX E E E E EEEE EEEE 在置换 a 4 a_4 a4 下不变, D ( a 4 ) = 2 D(a_4)=2 D(a4)=2

∴ L = 1 4 ( 16 + 2 + 4 + 2 ) = 6 \displaystyle\therefore L=\frac{1}{4}(16+2+4+2)=6 L=41(16+2+4+2)=6

Polya定理

我们发现要计算 D ( a j ) D(a_j) D(aj) 很不容易,所以 Polya 老头就教我们了一个很好的办法。

我们先介绍一下循环的概念:

( a 1 a 2 … a n ) = ( a 1 a 2 … a n a 2 a 3 … a 1 ) (a_1a_2\dots a_n)=\left(\begin{matrix}a_1&a_2&\dots&a_n \\a_2&a_3&\dots&a_1\end{matrix}\right) (a1a2an)=(a1a2a2a3ana1)

例如:

( 1 2 3 4 5 1 3 2 4 5 ) = ( 23 ) ( 1 ) ( 4 ) ( 5 ) \left(\begin{matrix}1&2&3&4&5\\1&3&2&4&5\end{matrix}\right)=(23)(1)(4)(5) (1123324455)=(23)(1)(4)(5)

称为 n n n 阶循环,置换的循环节数是上述的循环个数。

其实一个置换可以写成若干个不相交的循环的乘积,两个循环不相交的意思是循环 ( a 1 a 2 … a n ) (a_1 a_2\dots a_n) (a1a2an) ( b 1 b 2 … b n ) (b_1 b_2\dots b_n) (b1b2bn) a i ≠ b j , i , j = 1 , 2 , … n a_i \neq b_j,i,j=1,2,\dots n ai=bj,i,j=1,2,n 这样的表示是唯一的。

现在开始正式的 Polya 定理:

G G G p p p 个对象的一个置换群,用 m m m 种颜色涂染 p p p 个对象,则不同的染色方案是:

L = 1 ∣ G ∣ ( m c ( g 1 ) + m c ( g 2 ) + ⋯ + m c ( g s ) ) \displaystyle L=\frac{1}{|G|}(m^{c(g_1)}+m^{c(g_2)}+\dots+m^{c(g_s)}) L=G1(mc(g1)+mc(g2)++mc(gs))

其中 G = { g 1 , g 2 , … g s } G=\lbrace g_1,g_2,\dots g_s\rbrace G={g1,g2,gs} c ( g i ) c(g_i) c(gi) 为置换 g i g_i gi 的循环节数 ( i = 1 , 2 , … s ) (i=1,2,\dots s) (i=1,2,s)

继续举 Burnside 引理那个例子,我们给 N = 4 N=4 N=4 的环编号: 1 2 4 3 \begin{matrix}1&2\\4&3\end{matrix} 1423

构造一个置换群 G ′ = { g 1 , g 2 , … g s } G'=\lbrace g_1,g_2,\dots g_s\rbrace G={g1,g2,gs} ∣ G ′ ∣ = 4 |G'|=4 G=4 g i g_i gi 的循环节数为 c ( g i ) ( i = 1 , 2 , 3 , 4 ) c(g_i) (i=1,2,3,4) c(gi)(i=1,2,3,4),在 G ′ G' G 的作用下,其中:

g 1 g_1 g1 表示转 0 ∘ 0^\circ 0 g 1 = ( 1 ) ( 2 ) ( 3 ) ( 4 ) , c ( g 1 ) = 4 , 2 c ( g 1 ) = 2 4 = 16 = D ( a 1 ) g_1=(1)(2)(3)(4),c(g_1)=4,2^{c(g_1)}=2^4=16=D(a_1) g1=(1)(2)(3)(4),c(g1)=4,2c(g1)=24=16=D(a1)

g 2 g_2 g2 表示转 9 0 ∘ 90^\circ 90 g 2 = ( 4321 ) , c ( g 2 ) = 1 , 2 c ( g 2 ) = 2 1 = 2 = D ( a 2 ) g_2=(4321), c(g_2)=1,2^{c(g_2)}=2^1=2=D(a_2) g2=(4321),c(g2)=1,2c(g2)=21=2=D(a2)

g 3 g_3 g3 表示转 18 0 ∘ 180^\circ 180 g 3 = ( 13 ) ( 24 ) , c ( g 3 ) = 2 , 2 c ( g 2 ) = 2 2 = 4 = D ( a 3 ) g_3=(13)(24), c(g_3)=2, 2^{c(g_2)}=2^2=4=D(a_3) g3=(13)(24),c(g3)=2,2c(g2)=22=4=D(a3)

g 4 g_4 g4 表示转 27 0 ∘ 270^\circ 270 g 4 = ( 1234 ) , c ( g 4 ) = 1 , 2 c ( g 4 ) = 2 1 = 2 = D ( a 4 ) g_4=(1234), c(g_4)=1, 2^{c(g_4)}=2^1=2=D(a_4) g4=(1234),c(g4)=1,2c(g4)=21=2=D(a4)

P6597 烯烃计数

有两种点 C 和 H,每个 C 点和每个 H 点都是相同的,即无标号。求满足以下条件的不同无向图的个数:

由 C 点和 H 点组成。

C 点个数 n n n,H点个数 2 n 2n 2n

每个 C 点度数为 4 4 4,每个 H 点度数为 1 1 1

1 ≤ n ≤ 1000001 1 \leq n\le 1000001 1n1000001

解:

把碳-碳双键看作关键边,断开这条关键边,两边分别是一棵根节点的子节点个数 ≤ 2 \leq 2 2,除根节点外子节点个数 ≤ 3 \leq 3 3 的无标号有根树

先用 Burnside 引理求出这棵树的方案再合并即可

n n n 个点的烷基计数的普通生成函数为 A ( x ) A(x) A(x),要求的树的普通生成函数为 P ( x ) P(x) P(x)

P ( x ) = x A ( x ) 2 + A ( x 2 ) 2 P(x)=x\frac{A(x)^2+A(x^2)}{2} P(x)=x2A(x)2+A(x2)

设答案的普通生成函数为 Q ( x ) Q(x) Q(x)

Q ( x ) = ( P ( x ) − 1 ) 2 + P ( x 2 ) − 1 2 Q(x)=\frac{(P(x)-1)^2+P(x^2)-1}{2} Q(x)=2(P(x)1)2+P(x2)1

莫比乌斯反演

简化计算的一个好东东。

F ( n ) F(n) F(n) f ( n ) f(n) f(n) 是定义在非负整数集上的两个函数,并且 F ( n ) = ∑ d ∣ n f ( d ) \displaystyle F(n)=\sum_{d|n}f(d) F(n)=dnf(d) 那么:

f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) \displaystyle f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d}) f(n)=dnμ(d)F(dn)

μ \mu μ 的定义如下:

  1. d = 1 , μ ( d ) = 1 d=1,\mu(d)=1 d=1,μ(d)=1

  2. d = p 1 p 2 … p k d=p_1p_2\dots p_k d=p1p2pk, p i p_i pi 均为互异素数, μ ( d ) = ( − 1 ) k \mu(d)=(-1)^k μ(d)=(1)k

  3. 其他情况: μ ( d ) = 0 \mu(d)=0 μ(d)=0

μ \mu μ 函数有几个性质:

1. ∀ n ∈ Z + , ∑ d ∣ n μ ( d ) = { 1 n = 1 0 n > 1 \displaystyle\forall n\in Z^+, \sum_{d|n}\mu(d)= \begin{cases}1 & n=1\\0 & n>1\end{cases} nZ+,dnμ(d)={10n=1n>1

2. ∀ n ∈ Z + , ∑ d ∣ n μ ( d ) d = ϕ ( n ) n \displaystyle\forall n\in Z^+, \sum_{d|n}\frac{\mu(d)}{d}=\frac{\phi(n)}{n} nZ+,dndμ(d)=nϕ(n)

证明:

f ( n ) = ∑ d ∣ n μ ( d ) F ( n d ) = ∑ d ∣ n μ ( d ) ∑ k ∣ n d f ( k ) = ∑ k ∣ n f ( k ) ∑ d n k μ ( d ) \displaystyle f(n)=\sum_{d|n}\mu(d)F(\frac{n}{d})=\sum_{d|n}\mu(d)\sum_{k|\frac{n}{d}}f(k)=\sum_{k|n}f(k)\sum_{d\frac{n}{k}}\mu(d) f(n)=dnμ(d)F(dn)=dnμ(d)kdnf(k)=knf(k)dknμ(d)

∵ ∑ d ∣ n μ ( d ) = { 1 n = 1 0 n > 1 \because \sum_{d|n}\mu(d)=\begin{cases}1&n=1 \\0&n>1\end{cases} dnμ(d)={10n=1n>1

∴ w h e n n k = 1 \displaystyle\therefore when\frac{n}{k}=1 whenkn=1就是$ n == k , , ,\displaystyle\sum_{d|\frac{n}{k}}\mu(d)=1$,其余时候为 0 0 0

也就搞出来了

P6810 Convex Hull 凸包

求: ∑ i = 1 n ∑ j = 1 m τ ( i ) τ ( j ) τ ( gcd ⁡ ( i , j ) ) \displaystyle\sum_{i = 1}^n \sum_{j = 1}^m \tau(i) \tau(j) \tau(\gcd(i, j)) i=1nj=1mτ(i)τ(j)τ(gcd(i,j))

τ τ τ 表示约数个数,比如 τ ( 6 ) = 4 \tau(6) = 4 τ(6)=4

1 ≤ n , m ≤ 2 × 1 0 6 , 1 ≤ p ≤ 1 0 9 1\leq n,m \leq 2\times10^6,1 \leq p \leq 10^9 1n,m2×106,1p109

解:

原式 = ∑ d = 1 min ⁡ ( n , m ) τ ( d ) ∑ i = 1 n ∑ j = 1 m [ gcd ⁡ ( i , j ) = d ] τ ( i ) τ ( j ) = ∑ d = 1 min ⁡ ( n , m ) τ ( d ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ [ gcd ⁡ ( i , j ) = 1 ] τ ( i d ) τ ( j d ) = ∑ d = 1 min ⁡ ( n , m ) τ ( d ) ∑ i = 1 ⌊ n d ⌋ ∑ j = 1 ⌊ m d ⌋ τ ( i d ) τ ( j d ) ∑ q   ∣ gcd ⁡ ( i , j ) μ ( q ) = ∑ d = 1 min ⁡ ( n , m ) τ ( d ) ∑ q = 1 ⌊ min ⁡ ( n , m ) d ⌋ μ ( q ) ∑ i = 1 ⌊ n d q ⌋ ∑ j = 1 ⌊ m d q ⌋ τ ( i d q ) τ ( j d q ) = ∑ d = 1 min ⁡ ( n , m ) τ ( d ) ∑ q = 1 ⌊ min ⁡ ( n , m ) d ⌋ μ ( q ) ∑ i = 1 ⌊ n d q ⌋ τ ( i d q ) ∑ j = 1 ⌊ m d q ⌋ τ ( j d q ) = ∑ d = 1 min ⁡ ( n , m ) τ ( d ) ∑ q = 1 ⌊ min ⁡ ( n , m ) d ⌋ μ ( q ) ∑ d q   ∣   i n τ ( i ) ∑ d q   ∣   j m τ ( j ) = \displaystyle\sum_{d = 1}^{\min(n, m)} \tau(d) \sum_{i = 1}^n \sum_{j = 1}^m [\gcd(i, j) = d] \tau(i) \tau(j)\\= \displaystyle\sum_{d = 1}^{\min(n, m)} \tau(d) \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} [\gcd(i, j) = 1] \tau(id) \tau(jd)\\= \displaystyle\sum_{d = 1}^{\min(n, m)} \tau(d) \sum_{i = 1}^{\lfloor \frac{n}{d} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{d} \rfloor} \tau(id) \tau(jd) \sum_{q\ | \gcd(i, j)} \mu(q)\\= \displaystyle\sum_{d = 1}^{\min(n, m)} \tau(d) \sum_{q = 1}^{\lfloor \frac{\min(n, m)}{d} \rfloor} \mu(q) \sum_{i = 1}^{\lfloor \frac{n}{dq} \rfloor} \sum_{j = 1}^{\lfloor \frac{m}{dq} \rfloor} \tau(idq) \tau(jdq)\\= \displaystyle\sum_{d = 1}^{\min(n, m)} \tau(d) \sum_{q = 1}^{\lfloor \frac{\min(n, m)}{d} \rfloor} \mu(q) \sum_{i = 1}^{\lfloor \frac{n}{dq} \rfloor} \tau(idq) \sum_{j = 1}^{\lfloor \frac{m}{dq} \rfloor} \tau(jdq)\\= \displaystyle\sum_{d = 1}^{\min(n, m)} \tau(d) \sum_{q = 1}^{\lfloor \frac{\min(n, m)}{d} \rfloor} \mu(q) \sum_{dq\ |\ i}^n \tau(i) \sum_{dq\ |\ j}^m \tau(j) =d=1min(n,m)τ(d)i=1nj=1m[gcd(i,j)=d]τ(i)τ(j)=d=1min(n,m)τ(d)i=1dnj=1dm[gcd(i,j)=1]τ(id)τ(jd)=d=1min(n,m)τ(d)i=1dnj=1dmτ(id)τ(jd)q gcd(i,j)μ(q)=d=1min(n,m)τ(d)q=1dmin(n,m)μ(q)i=1dqnj=1dqmτ(idq)τ(jdq)=d=1min(n,m)τ(d)q=1dmin(n,m)μ(q)i=1dqnτ(idq)j=1dqmτ(jdq)=d=1min(n,m)τ(d)q=1dmin(n,m)μ(q)dq  inτ(i)dq  jmτ(j)

预处理 μ \mu μ τ \tau τ 函数的值,然后直接计算即可。

卡特兰数

卡特兰数就是如图从A走到B并且不穿过那根红线的方法数。
运用表述法求出了几个值。

组合数学进阶笔记_第1张图片

n n n 个卡特兰数便是在 n × n n\times n n×n 的方格中,从左下角走到右上角的方法数。

记: C n C_{n} Cn 为第 n n n 个卡特兰数,如果我们假设 C 0 = 1 , C 1 = 1 C_0=1, C_1=1 C0=1,C1=1 那么,可得 C n + 1 = C 0 C n + C 1 C n − 1 + ⋯ + C n C 0 C_{n+1}=C_0C_n+C_1C_{n-1}+\dots+C_nC_0 Cn+1=C0Cn+C1Cn1++CnC0,它的通项公式为 C n = ( 2 n ) ! ( n + 1 ) ! × n ! ( n ≥ 2 ) \displaystyle C_{n}=\frac{(2n)!}{(n+1)!\times n!} (n\geq2) Cn=(n+1)!×n!(2n)!(n2)

P2532 [AHOI2012]树屋阶梯

在一个 n × n n\times n n×n 的图形中,用n个长方体填充,没有空缺和重复,问有几种方法?

组合数学进阶笔记_第2张图片

在n=3时已给出:

组合数学进阶笔记_第3张图片

1 ≤ n ≤ 500 1\leq n\leq 500 1n500

解:

我们发现对于任何大小为 i i i 的树屋阶梯,都可以由左上角放一块大小为 j j j 的以及右下角放一块大小为 i − j − 1 i - j - 1 ij1 的树屋阶梯,再在空缺的地方由单个大块的矩形填充即可构成,这个构成的树屋阶梯一共有 ( j ) + ( i − j − 1 ) + 1 (j) + (i - j - 1) + 1 (j)+(ij1)+1 个钢材,正好是 i i i 个。因为 j j j 可以在 0 0 0 i − 1 i - 1 i1 取且可以证明每一个构成的树屋阶梯一定各不相同,所以我们可以得到树屋阶梯方案与大小关系的递推式 f i = f i − 1 f 0 + f i − 2 f 1 … f 0 f i − 1 f_i = f_{i - 1}f_0 + f_{i - 2}f_{1}\dots f_0f_{i-1} fi=fi1f0+fi2f1f0fi1。同时,我们规定 f 0 = f 1 = 1 f_0=f_1=1 f0=f1=1。这不就是卡特兰数吗。

举个例子,我们可以怎么构成大小为 4 4 4 的树屋阶梯呢?首先有第 1 1 1 种构成方法:在左上角放上 1 1 1 个任意大小为 0 0 0 的树屋阶梯,在右下角放上 1 1 1 个任意大小为 3 3 3 的树屋阶梯,并在左下角的空缺用单个矩形填充。如图下所示:

组合数学进阶笔记_第4张图片

这种构成方法下,我们能构成可行的树屋阶梯 f 0 × f 3 = 1 × 5 = 5 f_0 × f_3 = 1 × 5 = 5 f0×f3=1×5=5 个。

2 2 2 种构成方法:在左上角放上 1 1 1 个任意大小为 1 1 1 的树屋阶梯,在右下角放上 1 1 1 个任意大小为 2 2 2 的树屋阶梯,并在左下角的空缺用单个矩形填充。如图下所示:

组合数学进阶笔记_第5张图片

这种构成方法下,我们能构成可行的树屋阶梯 f 1 × f 2 = 1 × 2 = 2 f_1 × f_2 = 1 × 2 = 2 f1×f2=1×2=2个。

类似地,还有 2 2 2 种构成方法,本质上是和上面的 2 2 2 种构成方法是一样的。所有方案数加在一起,得 f 4 = 14 f_4 = 14 f4=14,正是卡特兰数了。所以直接卡特兰通项公式一下,要使用高精。

斯特林数

第一类

将n个元素排成k个轮换,记作 [ n k ] \left[\begin{matrix}n\\k\end{matrix}\right] [nk],读作“ n n n 轮换 k k k”。可以把轮换想成一个环,写成 [ A , B , C , D ] [A,B,C,D] [A,B,C,D] 把它理解为 [ A , B , C , D ] = [ B , C , D , A ] = [ C , D , A , B ] = [ D , A , B , C ] [A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C] [A,B,C,D]=[B,C,D,A]=[C,D,A,B]=[D,A,B,C] 但是 [ A , B , C , D ] ≠ [ A , B , D , C ] ≠ [ D , C , B , A ] [A,B,C,D]\neq[A,B,D,C]\neq[D,C,B,A] [A,B,C,D]=[A,B,D,C]=[D,C,B,A]

4 4 4 分成两个轮换: [ 1 , 2 , 3 ] [ 4 ] , [ 1 , 2 , 4 ] [ 3 ] , [ 1 , 3 , 4 ] [ 2 ] , [ 2 , 3 , 4 ] [ 1 ] , [ 1 , 3 , 2 ] [ 4 ] , [ 1 , 4 , 2 ] [ 3 ] , [ 1 , 4 , 3 ] [ 2 ] , [ 2 , 4 , 3 ] [ 1 ] , [ 1 , 2 ] [ 3 , 4 ] , [ 1 , 3 ] [ 2 , 4 ] [1,2,3][4],[1,2,4][3],[1,3,4][2],[2,3,4][1],[1,3,2][4],[1,4,2][3],[1,4,3][2],[2,4,3][1],[1,2][3,4],[1,3][2,4] [1,2,3][4],[1,2,4][3],[1,3,4][2],[2,3,4][1],[1,3,2][4],[1,4,2][3],[1,4,3][2],[2,4,3][1],[1,2][3,4],[1,3][2,4]

∴ [ 4 2 ] = 11 \therefore \left[\begin{matrix}4\\2\end{matrix}\right]=11 [42]=11

很容易看出来 [ n 1 ] = n ! n = ( n − 1 ) ! \displaystyle\left[\begin{matrix}n\\1\end{matrix}\right]=\frac{n!}{n}=(n-1)! [n1]=nn!=(n1)! [ n n ] = 1 \displaystyle\left[\begin{matrix}n\\n\end{matrix}\right]=1 [nn]=1
[ n n − 1 ] = ( n 2 ) \displaystyle\left[\begin{matrix}n\\n-1\end{matrix}\right]=\left(\begin{matrix}n\\2\end{matrix}\right) [nn1]=(n2)

给个递归式: [ n k ] = ( n − 1 ) [ n − 1 k ] + [ n − 1 k − 1 ] \left[\begin{matrix}n\\k\end{matrix}\right]=(n-1)\left[\begin{matrix}n-1\\k\end{matrix}\right]+\left[\begin{matrix}n-1\\k-1\end{matrix}\right] [nk]=(n1)[n1k]+[n1k1]

$\ \ $

$\ \ $

$\ \ $

$\ \ $

P5408 第一类斯特林数·行

按顺序输出 [ n 0 ] , [ n 1 ] , [ n 2 ] , … , [ n n ] \begin{bmatrix}n\\ 0\end{bmatrix},\begin{bmatrix}n\\ 1\end{bmatrix},\begin{bmatrix}n\\ 2\end{bmatrix},\dots,\begin{bmatrix}n\\ n\end{bmatrix} [n0],[n1],[n2],,[nn]的值。

1 ⩽ n < 262144 1\leqslant n < 262144 1n<262144

解:

n n n 行第一类斯特林数的生成函数为

x n ‾ = ∏ i = 0 n − 1 ( x + i ) = ∑ i = 0 n [ n i ] x i x^{\overline n}=\prod\limits_{i=0}^{n-1}(x+i)=\sum\limits_{i=0}^n\begin{bmatrix} n\\i\end{bmatrix}x^i xn=i=0n1(x+i)=i=0n[ni]xi

所以我们只需要求出那个连续乘积就好了
考虑倍增。

x 2 n ‾ = x n ‾ ( x + n ) n ‾ x^{\overline {2n}}=x^{\overline n}(x+n)^{\overline n} x2n=xn(x+n)n
也就是

∏ i = 0 2 n − 1 ( x + i ) = ∏ i = 0 n − 1 ( x + i ) ∏ i = 0 n − 1 ( x + n + i ) \prod\limits_{i=0}^{2n-1}(x+i)=\prod\limits_{i=0}^{n-1}(x+i)\prod\limits_{i=0}^{n-1}(x+n+i) i=02n1(x+i)=i=0n1(x+i)i=0n1(x+n+i)

那么只要能给定一个 n n n 次多项式 f ( x ) f(x) f(x),快速计算出 f ( x + k ) f(x+k) f(x+k) 就行。

为了方便下面表述,我们设 a i = [ x i ] f ( x ) a_i=[x^i]f(x) ai=[xi]f(x)

f ( x + k ) = ∑ i = 0 n a i ( x + k ) i = ∑ i = 0 n a i ∑ j = 0 i ( i j ) x j k i − j = ∑ i = 0 n x i ∑ j = i n ( j i ) k j − i a j = ∑ i = 0 n x i i ! ∑ j = i n k j − i ( j − i ) ! j ! a j f(x+k)=\sum\limits_{i=0}^na_i(x+k)^i\\=\sum\limits_{i=0}^na_i\sum\limits_{j=0}^i\binom{i}{j}x^jk^{i-j}\\= \sum\limits_{i=0}^nx^i\sum\limits_{j=i}^n \binom{j}{i}k^{j-i}a_j\\=\sum\limits_{i=0}^n\frac{x^i}{i!}\sum\limits_{j=i}^{n}\frac{k^{j-i}}{(j-i)!}j!a_j f(x+k)=i=0nai(x+k)i=i=0naij=0i(ji)xjkij=i=0nxij=in(ij)kjiaj=i=0ni!xij=in(ji)!kjij!aj

这个式子是卷积,下面演示一下为什么

g ( x ) = ∑ i = 0 n k i i ! x n − i g(x)=\sum\limits_{i=0}^n\frac{k^i}{i!}x^{n-i} g(x)=i=0ni!kixni

h ( x ) = ∑ i = 0 n i ! a i x i h(x) = \sum\limits_{i=0}^ni!a_ix^i h(x)=i=0ni!aixi

那么只需要将 g ( x ) g(x) g(x) h ( x ) h(x) h(x) 乘起来,然后左移n位(也就是将i次项系数变为 n + i n+i n+i 次项系数)之后,第i次都乘上 i ! i! i! 就是我们想要的 f ( x + k ) f(x+k) f(x+k) 了。

当然,倍增过程中还要有计算 x n ‾ ( x + n ) x^{\overline n}(x+n) xn(x+n) 的情况,暴力线性算一下即可。

时间复杂度 T ( n ) = T ( n / 2 ) + Θ ( n log ⁡ n ) = Θ ( n log ⁡ n ) T(n)=T(n/2)+\Theta(n\log n)=\Theta(n \log n) T(n)=T(n/2)+Θ(nlogn)=Θ(nlogn)

P5409 第一类斯特林数·列

按顺序输出 [ 0 k ] , [ 1 k ] , [ 2 k ] , … , [ n k ] \begin{bmatrix}0\\ k\end{bmatrix},\begin{bmatrix}1\\ k\end{bmatrix},\begin{bmatrix}2\\ k\end{bmatrix},\dots,\begin{bmatrix}n\\ k\end{bmatrix} [0k],[1k],[2k],,[nk] 的值。

1 ⩽ k , n < 131072 1\leqslant k,n< 131072 1k,n<131072

解:

首先,我们可以对 k = 1 k=1 k=1 的情况构造指数级生成函数,即:

S ( x ) = ∑ i = 0 n ( i − 1 ) ! x i i ! S(x)=\sum_{i=0}^{n} (i-1)!\frac{x^i}{i!} S(x)=i=0n(i1)!i!xi

因为很显然 [ n 1 ] = ( n − 1 ) ! \begin{bmatrix} n \\ 1\end{bmatrix}=(n-1)! [n1]=(n1)!

那么,我们就可以得到,对于kk为任意数情况的指数级生成函数就是 S ( x ) k k ! \displaystyle\frac{S(x)^k}{k!} k!S(x)k

除以 k ! k! k! 的主要原因是我们用指数级生成函数的环排列其实是有顺序。就比如 [ 2 , 3 , 1 ] [ 1 , 2 ] [2,3,1][1,2] [2,3,1][1,2] [ 1 , 2 ] [ 2 , 3 , 1 ] [1,2][2,3,1] [1,2][2,3,1] 是等价的,但是我们算重了。

上面这个式子如果要美观一点就是:

( ln ⁡ 1 1 − x ) k k ! \displaystyle\frac{(\ln \frac{1}{1-x})^k}{k!} k!(ln1x1)k

这个可以通过泰勒展开得到。

时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)

第二类

将一个有 n n n 件物件的集合分成k个非空子集的方法数。记作 { n k } \left\{\begin{matrix}n\\k\end{matrix}\right\} {nk},读作 n 子集 k n子集k n子集k

举个例子:将 4 4 4 个元素的集合分为两个部分:
{ 1 , 2 , 3 } ∪ { 4 } , { 1 , 2 , 4 } ∪ { 3 } , { 1 , 3 , 4 } ∪ { 2 } , { 2 , 3 , 4 } ∪ { 1 } , { 1 , 2 } ∪ { 3 , 4 } , { 1 , 3 } ∪ { 2 , 4 } , { 1 , 4 } ∪ { 2 , 3 } \lbrace1,2,3\rbrace\cup\lbrace4\rbrace,\lbrace1,2,4\rbrace\cup\lbrace3\rbrace,\lbrace1,3,4\rbrace\cup\lbrace2\rbrace,\lbrace2,3,4\rbrace\cup\lbrace1\rbrace,\lbrace1,2\rbrace\cup\lbrace3,4\rbrace,\lbrace1,3\rbrace\cup\lbrace2,4\rbrace,\lbrace1,4\rbrace\cup\lbrace2,3\rbrace {1,2,3}{4},{1,2,4}{3},{1,3,4}{2},{2,3,4}{1},{1,2}{3,4},{1,3}{2,4},{1,4}{2,3}

∴ { 4 2 } = 7 \therefore \left\{\begin{matrix}4\\2\end{matrix}\right\}=7 {42}=7

用容斥原理可以推出 { n k } = 1 k ! ∑ i = 0 k − 1 ( − 1 ) i ( r i ) ( r − i ) n \displaystyle\left\{\begin{matrix}n\\k\end{matrix}\right\}=\frac{1}{k!}\sum_{i=0}^{k-1}(-1)^i\left(\begin{matrix}r\\i\end{matrix}\right)(r-i)^n {nk}=k!1i=0k1(1)i(ri)(ri)n

P5395 第二类斯特林数·行

按顺序输出 { n 0 } , { n 1 } , { n 2 } , … , { n n } \begin{Bmatrix} n \\0 \end{Bmatrix},\begin{Bmatrix} n \\1 \end{Bmatrix},\begin{Bmatrix} n \\2 \end{Bmatrix},\dots,\begin{Bmatrix} n \\n \end{Bmatrix} {n0},{n1},{n2},,{nn} 的值。

1 ⩽ n ⩽ 2 × 1 0 5 1\leqslant n\leqslant 2\times 10^5 1n2×105

解:

通项就是一个卷积式,直接预处理阶乘逆元,打快速幂板子,NTT即可.

P5396 第二类斯特林数·列

按顺序输出 { 0 k } , { 1 k } , { 2 k } , … , { n k } \begin{Bmatrix} 0 \\k \end{Bmatrix},\begin{Bmatrix} 1 \\k \end{Bmatrix},\begin{Bmatrix} 2 \\k \end{Bmatrix},\dots,\begin{Bmatrix} n \\k \end{Bmatrix} {0k},{1k},{2k},,{nk} 的值。

1 ⩽ k , n < 131072 1\leqslant k, n<131072 1k,n<131072

解:

考虑第 k k k 列斯特林数的生成函数

F k ( x ) = ∑ i { i k } x i F_k(x) = \sum\limits_{i} \begin{Bmatrix} i \\ k \end{Bmatrix} x^i Fk(x)=i{ik}xi

众所周知

{ i k } = k { i − 1 k } + { i − 1 k − 1 } \begin{Bmatrix} i \\ k\end{Bmatrix} = k\begin{Bmatrix} i-1 \\ k\end{Bmatrix} + \begin{Bmatrix} i -1\\ k-1\end{Bmatrix} {ik}=k{i1k}+{i1k1}

于是

F k ( x ) = ∑ i ( k { i − 1 k } + { i − 1 k − 1 } ) x i = ( ∑ i k { i − 1 k } x i ) + ( ∑ i { i − 1 k − 1 } x i ) = ( k x ∑ i { i k } x i ) + ( x ∑ i { i k − 1 } x i ) = k x F k ( x ) + x F k − 1 ( x ) \displaystyle\begin{aligned}F_k(x) &= \sum\limits_{i} \left( k\begin{Bmatrix} i-1\\k\end{Bmatrix} + \begin{Bmatrix} i-1 \\ k-1\end{Bmatrix}\right)x^i \\ &= \left(\sum\limits_{i} k\begin{Bmatrix} i-1 \\ k\end{Bmatrix}x^i \right) + \left( \sum\limits_{i} \begin{Bmatrix} i-1 \\ k-1\end{Bmatrix}x^i \right)\\&= \left(kx\sum\limits_{i} \begin{Bmatrix} i \\ k\end{Bmatrix}x^i\right) + \left(x\sum\limits_{i}\begin{Bmatrix} i\\ k-1\end{Bmatrix}x^i\right)\\&= kxF_k(x) + xF_{k-1}(x)\end{aligned} Fk(x)=i(k{i1k}+{i1k1})xi=(ik{i1k}xi)+(i{i1k1}xi)=(kxi{ik}xi)+(xi{ik1}xi)=kxFk(x)+xFk1(x)

移项后可以得到

F k ( x ) = x F k − 1 ( x ) 1 − k x \displaystyle F_k(x) = \frac{xF_{k-1}(x)}{1-kx} Fk(x)=1kxxFk1(x)

边界就是 F 0 ( x ) = 1 F_0(x) = 1 F0(x)=1

于是把上面那玩意儿一直展开下去,可以得到

F k ( x ) = x k ∏ i = 1 k ( 1 − i x ) \displaystyle F_k(x) = \frac{x^k}{\prod_{i=1}^{k} (1-ix)} Fk(x)=i=1k(1ix)xk

分治乘搞出分母,然后求逆在乘上 x k x^k xk 就好了

你可能感兴趣的:(笔记,算法)