· 组合数学基础
· 容斥原理
· 生成函数
· FFT/NTT
· 多项式exp,多项式ln,多项式快速幂,多项式平移
· 下降幂
x n ‾ = ∏ i = 1 n ( x − i + 1 ) x^{\underline{n}}=\prod^{n}_{i=1}(x-i+1) xn=∏i=1n(x−i+1)
· 上升幂
x n ˉ = ∏ i = 1 n ( x + i − 1 ) x^{\bar{n}}=\prod^{n}_{i=1}(x+i-1) xnˉ=∏i=1n(x+i−1)
结论:
1.显然有 x m ‾ = ( x − m + 1 ) m ˉ x^{\underline{m}}=(x-m+1)^{\bar{m}} xm=(x−m+1)mˉ
2. x m ‾ = ( − 1 ) m ( − x ) m ˉ ( m ∈ Z ) x^{\underline{m}}=(-1)^m(-x)^{\bar{m}}(m\in \Z) xm=(−1)m(−x)mˉ(m∈Z)
证明:
( − 1 ) m ( − x ) m ˉ = [ − ( − x ) ] [ − ( − x + 1 ) ] . . . [ − ( − x + n − 1 ) ] = x ( x − 1 ) . . . ( x − n + 1 ) = x n ‾ (-1)^m(-x)^{\bar{m}}=[-(-x)][-(-x+1)]...[-(-x+n-1)]=x(x-1)...(x-n+1)=x^{\underline{n}} (−1)m(−x)mˉ=[−(−x)][−(−x+1)]...[−(−x+n−1)]=x(x−1)...(x−n+1)=xn
当然还有 x m ˉ = ( − 1 ) m ( − x ) m ‾ ( m ∈ Z ) x^{\bar{m}}=(-1)^m(-x)^{\underline{m}}(m\in \Z) xmˉ=(−1)m(−x)m(m∈Z)
第一类斯特林数分为第一类无符号斯特林数和第一类带符号斯特林数两类。
在OI中多指第一类无符号斯特林数,接下来的我们称第一类无符号斯特林数为第一类斯特林数。
名称 | 第一类斯特林数 |
---|---|
组合意义 | n n n个数的序列划分为 k k k个圆排列的方案数。 |
书写方式 | [ n m ] \begin{bmatrix} n \\ m \end{bmatrix} [nm], s ( n , m ) s(n,m) s(n,m)两种。 |
一般递推形式 | [ n m ] = [ n − 1 m − 1 ] + ( n − 1 ) [ n − 1 m ] \begin{bmatrix} n \\ m \end{bmatrix}=\begin{bmatrix} n-1 \\ m-1 \end{bmatrix}+(n-1)\begin{bmatrix} n-1 \\ m \end{bmatrix} [nm]=[n−1m−1]+(n−1)[n−1m] |
生成函数形式 | f n ( x ) = x n ˉ f_n(x)=x^{\bar{n}} fn(x)=xnˉ |
求解时间复杂度 | 单列/行 O ( n log n ) O(n\log n) O(nlogn) 多组 O ( n 2 ) O(n^2) O(n2) |
我们知道 x k ‾ = x ⋅ ( x − 1 ) ⋅ . . . ⋅ ( x − k + 1 ) x^{\underline{k}}=x·(x-1)·...·(x-k+1) xk=x⋅(x−1)⋅...⋅(x−k+1)。
暴力展开就是
x k ‾ = ∑ i = 0 k ( − 1 ) k − i ⋅ [ k i ] ⋅ x i x^{\underline{k}}=\sum^{k}_{i=0}(-1)^{k-i}·\begin{bmatrix} k \\ i \end{bmatrix}·x^i xk=i=0∑k(−1)k−i⋅[ki]⋅xi
因此第一类斯特林数真正的定义是 x k ‾ x^{\underline{k}} xk展开后的系数,根据你计不计入前面的 ( − 1 ) k − i (-1)^{k-i} (−1)k−i系数分为有符号与无符号两类。
按照前面的递推式递推即可。
复杂度: O ( n 2 ) O(n^2) O(n2)。
显然可以写成OGF形式 f n ( x ) = x n ˉ f_n(x)=x^{\bar{n}} fn(x)=xnˉ
分治+NTT一下就好。
复杂度 O ( n log 2 n ) O(n\log^2n) O(nlog2n)。
f n ( x ) = ∑ i = 0 n a i ⋅ x i f_n(x)=\sum^{n}_{i=0}a_i·x^i fn(x)=∑i=0nai⋅xi
假设现在我们求出了 f n ( x ) f_n(x) fn(x),我们试图用倍增法求 f 2 n ( x ) = f n ( x ) ⋅ f n ( x + n ) f_{2n}(x)=f_n(x)·f_n(x+n) f2n(x)=fn(x)⋅fn(x+n)。
现在的唯一任务就是算出 f n ( x + n ) f_n(x+n) fn(x+n)。
f n ( x + n ) = ∑ i = 0 n a i ⋅ ( x + n ) i = ∑ i = 0 n ∑ j = 0 i a i ( i j ) n i − j x j = ∑ i = 0 n ∑ j = 0 i a i i ! ( i − j ) ! ⋅ j ! n i − j x j = ∑ i = 0 n x i i ! ∑ j = i n ( a j ⋅ j ! ) ⋅ n j − i ( j − i ) ! \begin{aligned} f_n(x+n) & =\sum^{n}_{i=0}a_i·(x+n)^i\\ & =\sum^{n}_{i=0}\sum^{i}_{j=0}a_i\binom{i}{j}n^{i-j}x^j\\ & =\sum^{n}_{i=0}\sum^{i}_{j=0}a_i \frac{i!}{(i-j)!·j!} n^{i-j}x^j\\ & =\sum^{n}_{i=0} \frac{x^i}{i!} \sum^{n}_{j=i} (a_j·j!)·\frac{n^{j-i}}{(j-i)!}\\ \end{aligned} fn(x+n)=i=0∑nai⋅(x+n)i=i=0∑nj=0∑iai(ji)ni−jxj=i=0∑nj=0∑iai(i−j)!⋅j!i!ni−jxj=i=0∑ni!xij=i∑n(aj⋅j!)⋅(j−i)!nj−i
我们最后再乘上 1 i ! \frac{1}{i!} i!1…所以这是…减法卷积???
其实只需要设 g ( x ) = ∑ i = 0 n n i i ! , t ( x ) = ∑ i = 0 n a i ⋅ i ! g(x)=\sum^{n}_{i=0} \frac{n^i}{i!},t(x)=\sum^{n}_{i=0}a_i·i! g(x)=∑i=0ni!ni,t(x)=∑i=0nai⋅i!。
然后算 g R ( x ) ⋅ t ( x ) g^R(x)·t(x) gR(x)⋅t(x)就好了(相当于算 ( n − j ) + i (n-j)+i (n−j)+i)。
注意这一部分最后要左移 n n n位。
然后我们递归解决就好了,注意奇数的时候单独乘以一个 ( x + i ) (x+i) (x+i)。
复杂度 T ( n ) = T ( n 2 ) + O ( n log n ) = O ( n log n ) T(n)=T(\frac{n}{2})+O(n\log n)=O(n\log n) T(n)=T(2n)+O(nlogn)=O(nlogn)。
考虑从组合数生成函数入手: ( x + 1 ) t (x+1)^t (x+1)t。
1.第一个方向,暴力展开:
( x + 1 ) t = ∑ i = 0 ∞ ( t i ) x i = ∑ i = 0 ∞ x i ⋅ t i ‾ i ! = ∑ i = 0 ∞ x i i ! ∑ j = 0 i ( − 1 ) i − j ⋅ [ i j ] ⋅ t j = ∑ i = 0 ∞ t i ∑ j = i ∞ ( − 1 ) j − i [ j i ] x j j ! \begin{aligned} (x+1)^t& =\sum^{∞}_{i=0}\binom{t}{i}x^i\\ & =\sum^{∞}_{i=0}\frac{x^i·t^{\underline{i}}}{i!}\\ & =\sum^{∞}_{i=0}\frac{x^i}{i!}\sum^{i}_{j=0}(-1)^{i-j}·\begin{bmatrix} i \\ j \end{bmatrix}·t^j\\ & =\sum^{∞}_{i=0}t^i\sum^{∞}_{j=i}(-1)^{j-i}\begin{bmatrix} j \\ i \end{bmatrix}\frac{x^j}{j!}\\ \end{aligned} (x+1)t=i=0∑∞(it)xi=i=0∑∞i!xi⋅ti=i=0∑∞i!xij=0∑i(−1)i−j⋅[ij]⋅tj=i=0∑∞tij=i∑∞(−1)j−i[ji]j!xj
2.第二个方向,考虑以 e e e换底:
( x + 1 ) t = e t ln ( x + 1 ) = ∑ i = 0 ∞ t i ⋅ l n ( x + 1 ) i i ! \begin{aligned} (x+1)^t&=e^{t\ln(x+1)}\\ &=\sum^{∞}_{i=0}t^i·\frac{ln(x+1)^i}{i!}\\ \end{aligned} (x+1)t=etln(x+1)=i=0∑∞ti⋅i!ln(x+1)i
然后我们就有了:
∑ i = 0 ∞ t i ∑ j = i ∞ ( − 1 ) j − i [ j i ] x j j ! = ∑ i = 0 ∞ t i ⋅ l n ( x + 1 ) i i ! \sum^{∞}_{i=0}t^i\sum^{∞}_{j=i}(-1)^{j-i}\begin{bmatrix} j \\ i \end{bmatrix}\frac{x^j}{j!}=\sum^{∞}_{i=0}t^i·\frac{ln(x+1)^i}{i!} i=0∑∞tij=i∑∞(−1)j−i[ji]j!xj=i=0∑∞ti⋅i!ln(x+1)i
去掉相同的部分
∑ j = i ∞ ( − 1 ) j − i [ j i ] x j j ! = l n ( x + 1 ) i i ! \sum^{∞}_{j=i}(-1)^{j-i}\begin{bmatrix} j \\ i \end{bmatrix}\frac{x^j}{j!}=\frac{ln(x+1)^i}{i!} j=i∑∞(−1)j−i[ji]j!xj=i!ln(x+1)i
其中 i i i就是指定的列数。
于是用多项式 l n ln ln和 e x p exp exp直接算就行了。
复杂度: O ( n log n ) O(n\log n) O(nlogn)(然而常数巨大)。
求单个可以做到lucas定理的范围 O ( p ) O(p) O(p)。
然而过程过于复杂[我看了半天,还是很蒙…],要讲也是之后了吧。
名称 | 第二类斯特林数 |
---|---|
组合意义 | n n n个不同的数的序列划分为 k k k个集合的方案数。 |
书写方式 | { n m } \begin{Bmatrix} n \\ m \end{Bmatrix} { nm}, S ( n , m ) S(n,m) S(n,m)两种。 |
一般递推形式 | { n m } = { n − 1 m − 1 } + m { n − 1 m } \begin{Bmatrix} n \\ m \end{Bmatrix}=\begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix}+m\begin{Bmatrix} n-1 \\ m \end{Bmatrix} { nm}={ n−1m−1}+m{ n−1m} |
和式形式 | 1 m ! ∑ k = 0 m ( − 1 ) k ( m k ) ( m − k ) n \frac{1}{m!}\sum^{m}_{k=0}(-1)^k\binom{m}{k}(m-k)^n m!1k=0∑m(−1)k(km)(m−k)n |
求解时间复杂度 | 单列/行 O ( n log n ) O(n\log n) O(nlogn) 多组 O ( n 2 ) O(n^2) O(n2) |
x n = ∑ i = 0 n { n i } x i ‾ x^n=\sum^{n}_{i=0}\begin{Bmatrix} n \\ i \end{Bmatrix}x^{\underline{i}} xn=i=0∑n{ ni}xi
也就是说第二类斯特林数是 x m x^m xm展开成下降幂形式的系数。
但由于从这个方向进行推导并不好理解,后面我们会通过组合意义以及递推式反向推出这个结论。
{ n m } = { n − 1 m − 1 } + m { n − 1 m } \begin{Bmatrix} n \\ m \end{Bmatrix}=\begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix}+m\begin{Bmatrix} n-1 \\ m \end{Bmatrix} { nm}={ n−1m−1}+m{ n−1m}
组合意义:比较简单,每个数要么放入一个新的集合,方案数 { n − 1 m − 1 } \begin{Bmatrix} n-1 \\ m-1 \end{Bmatrix} { n−1m−1},要么选择一个前面已有的集合放进去,方案数 m { n − 1 m } m\begin{Bmatrix} n-1 \\ m \end{Bmatrix} m{ n−1m}。
x n = ∑ i = 0 n { n i } x i ‾ = ∑ i = 0 n { n i } ( x i ) ⋅ i ! x^n=\sum^{n}_{i=0}\begin{Bmatrix} n \\ i \end{Bmatrix}x^{\underline{i}}=\sum^{n}_{i=0}\begin{Bmatrix} n \\ i \end{Bmatrix}\binom{x}{i}·i! xn=i=0∑n{ ni}xi=i=0∑n{ ni}(ix)⋅i!
证明:
设 f ( n ) = ∑ i = 0 n { n i } x i ‾ f(n)=\sum^{n}_{i=0}\begin{Bmatrix} n \\ i \end{Bmatrix}x^{\underline{i}} f(n)=∑i=0n{ ni}xi
当 n = 0 n=0 n=0时显然有 f ( n ) = 1 f(n)=1 f(n)=1
当 n > 0 n>0 n>0时,考虑化简:
f ( n ) = ∑ i = 0 n { n i } x i ‾ = ∑ i = 1 n { n − 1 i − 1 } x i ‾ + ∑ i = 0 n − 1 i { n − 1 i } x i ‾ = ∑ i = 0 n − 1 { n − 1 i } x i + 1 ‾ + ∑ i = 0 n − 1 i { n − 1 i } x i ‾ = ∑ i = 0 n − 1 ( x − i ) { n − 1 i } x i ‾ + ∑ i = 0 n − 1 i { n − 1 i } x i ‾ = x ∑ i = 0 n − 1 { n − 1 i } x i ‾ = x f ( n − 1 ) \begin{aligned} f(n)&=\sum^{n}_{i=0}\begin{Bmatrix} n \\ i \end{Bmatrix}x^{\underline{i}}\\ &=\sum^{n}_{i=1}\begin{Bmatrix} n-1 \\ i-1 \end{Bmatrix}x^{\underline{i}}+\sum^{n-1}_{i=0}i\begin{Bmatrix} n-1 \\ i \end{Bmatrix}x^{\underline{i}}\\ &=\sum^{n-1}_{i=0}\begin{Bmatrix} n-1 \\ i \end{Bmatrix}x^{\underline{i+1}}+\sum^{n-1}_{i=0}i\begin{Bmatrix} n-1 \\ i \end{Bmatrix}x^{\underline{i}}\\ &=\sum^{n-1}_{i=0}(x-i)\begin{Bmatrix} n-1 \\ i \end{Bmatrix}x^{\underline{i}}+\sum^{n-1}_{i=0}i\begin{Bmatrix} n-1 \\ i \end{Bmatrix}x^{\underline{i}}\\ &=x\sum^{n-1}_{i=0}\begin{Bmatrix} n-1 \\ i \end{Bmatrix}x^{\underline{i}}\\ &=xf(n-1)\\ \end{aligned} f(n)=i=0∑n{ ni}xi=i=1∑n{ n−1i−1}xi+i=0∑n−1i{ n−1i}xi=i=0∑n−1{ n−1i}xi+1+i=0∑n−1i{ n−1i}xi=i=0∑n−1(x−i){ n−1i}xi+i=0∑n−1i{ n−1i}xi=xi=0∑n−1{ n−1i}xi=xf(n−1)
显然 f ( x ) = x n f(x)=x^n f(x)=xn
组合意义:
m n m^n mn是 n n n个不同的小球放进 m m m个不同的盒子中,允许盒子为空的方案数。
· 选择 i i i个盒子非空,方案数 ( m i ) \begin{pmatrix} m \\ i \end{pmatrix} (mi)。
· 再将 n n n个球放进去,方案数 { n i } \begin{Bmatrix} n \\ i \end{Bmatrix} { ni}。
· 由于盒子不同,再乘上 i ! i! i!。
∑ i = 0 n i k = ∑ j = 0 k { k j } ( n + 1 ) j + 1 ‾ j + 1 \sum^{n}_{i=0}i^k=\sum^{k}_{j=0}\begin{Bmatrix} k \\ j \end{Bmatrix} \frac{(n+1)^{\underline{j+1}}}{j+1} i=0∑nik=j=0∑k{ kj}j+1(n+1)j+1
根据性质2和公式 ∑ i = j n ( i j ) = ( n + 1 j + 1 ) \sum^{n}_{i=j}\begin{pmatrix} i \\ j \end{pmatrix}=\begin{pmatrix} n+1 \\ j+1 \end{pmatrix} ∑i=jn(ij)=(n+1j+1)化简即可。
∑ i = 0 n i k = ∑ i = 0 n ∑ j = 0 k { k j } ⋅ j ! ⋅ ( i j ) = ∑ j = 0 k { k j } ⋅ j ! ∑ i = j n ( i j ) = ∑ j = 0 k { k j } ⋅ j ! ⋅ ( n + 1 j + 1 ) = ∑ j = 0 k { k j } ( n + 1 ) j + 1 ‾ j + 1 \begin{aligned} \sum^{n}_{i=0}i^k&=\sum^{n}_{i=0}\sum^{k}_{j=0}\begin{Bmatrix} k \\ j \end{Bmatrix}·j!·\begin{pmatrix} i \\ j \end{pmatrix}\\ &=\sum^{k}_{j=0}\begin{Bmatrix} k \\ j \end{Bmatrix}·j!\sum^{n}_{i=j}\begin{pmatrix} i \\ j \end{pmatrix}\\ &=\sum^{k}_{j=0}\begin{Bmatrix} k \\ j \end{Bmatrix}·j!·\begin{pmatrix} n+1 \\ j+1 \end{pmatrix}\\ &=\sum^{k}_{j=0}\begin{Bmatrix} k \\ j \end{Bmatrix} \frac{(n+1)^{\underline{j+1}}}{j+1}\\ \end{aligned} i=0∑nik=i=0∑nj=0∑k{ kj}⋅j!⋅(ij)=j=0∑k{ kj}⋅j!i=j∑n(ij)=j=0∑k{ kj}⋅j!⋅(n+1j+1)=j=0∑k{ kj}j+1(n+1)j+1
这样预处理,计算都可以 O ( k 2 ) O(k^2) O(k2)完成了。
因此我们有了一个 O ( k 2 ) O(k^2) O(k2)计算自然数幂和的做法。
然而通过拉格朗日插值法能够做到 O ( k log k ) O(k\log k) O(klogk)甚至 O ( k ) O(k) O(k)的。
{ n m } = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) i n \begin{Bmatrix} n \\ m \end{Bmatrix}=\frac{1}{m!}\sum^{m}_{i=0}(-1)^{m-i}\binom{m}{i}i^n { nm}=m!1i=0∑m(−1)m−i(im)in
证明:
设 f ( m ) = m n , g ( m ) = { n m } ⋅ m ! f(m)=m^n,g(m)=\begin{Bmatrix} n \\ m \end{Bmatrix}·m! f(m)=mn,g(m)={ nm}⋅m!。
用二项式反演解决
f ( m ) = ∑ i = 0 m ( m i ) g ( i ) g ( m ) = ∑ i = 0 m ( − 1 ) m − i ( m i ) f ( i ) { n m } = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) f ( i ) = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) ⋅ i n \begin{aligned} f(m)&=\sum^{m}_{i=0}\binom{m}{i}g(i)\\ g(m)&=\sum^{m}_{i=0}(-1)^{m-i}\binom{m}{i}f(i)\\ \begin{Bmatrix} n \\ m \end{Bmatrix}&=\frac{1}{m!}\sum^{m}_{i=0}(-1)^{m-i}\binom{m}{i}f(i)\\ &=\frac{1}{m!}\sum^{m}_{i=0}(-1)^{m-i}\binom{m}{i}·i^n\\ \end{aligned} f(m)g(m){ nm}=i=0∑m(im)g(i)=i=0∑m(−1)m−i(im)f(i)=m!1i=0∑m(−1)m−i(im)f(i)=m!1i=0∑m(−1)m−i(im)⋅in
组合意义:
我们先假设盒子有区别,注意到如果允许空盒存在时答案就是 m n m^n mn,考虑通过限制非空盒数量容斥。
设非空盒数量为 i i i。
· 从 m m m个盒子中选出 i i i个非空盒,方案数 ( m i ) \begin{pmatrix} m \\ i \end{pmatrix} (mi)。
· 非空盒随便放,方案数 i n i^n in。
· 由于盒子实际上无区别,最后应乘上 1 m ! \frac{1}{m!} m!1。
按照一般递推式递推即可。
复杂度 O ( n 2 ) O(n^2) O(n2)。
利用性质4的式子计算即可。
复杂度 O ( n ) O(n) O(n)。
再次观察性质四的结论:
{ n m } = 1 m ! ∑ i = 0 m ( − 1 ) m − i ( m i ) i n \begin{Bmatrix} n \\ m \end{Bmatrix}=\frac{1}{m!}\sum^{m}_{i=0}(-1)^{m-i}\binom{m}{i}i^n { nm}=m!1i=0∑m(−1)m−i(im)in
我们将组合数拆开:
{ n m } = 1 m ! ∑ i = 0 m ( − 1 ) m − i m ! i ! ⋅ ( m − i ) ! i n = ∑ i = 0 m ( − 1 ) m − i ( m − i ) ! i n i ! \begin{aligned} \begin{Bmatrix} n \\ m \end{Bmatrix}&=\frac{1}{m!}\sum^{m}_{i=0}(-1)^{m-i}\frac{m!}{i!·(m-i)!}i^n\\ &=\sum^{m}_{i=0}\frac{(-1)^{m-i}}{(m-i)!}\frac{i^n}{i!} \end{aligned} { nm}=m!1i=0∑m(−1)m−ii!⋅(m−i)!m!in=i=0∑m(m−i)!(−1)m−ii!in
发现这是一个相当标准的卷积形式。
因此直接设 f ( x ) = ∑ i = 0 m ( − 1 ) i i ! x i f(x)=\sum^{m}_{i=0}\frac{(-1)^i}{i!}x^i f(x)=∑i=0mi!(−1)ixi和 g ( x ) = ∑ i = 0 m i n i ! x i g(x)=\sum^{m}_{i=0}\frac{i^n}{i!}x^i g(x)=∑i=0mi!inxi,用NTT卷起来就好。
复杂度: O ( n log n ) O(n\log n) O(nlogn)。
最好学完下面的斯特林反演再来看这一部分。
跟第一类斯特林数单个的范围一样…同样被咕掉了。
–updating–
根据提示默写方程式:
xxxxx, K S C N KSCN KSCN滴眼睛。
F e + 3 + 3 S C N − = F e ( S C N ) 3 Fe^{+3}+3SCN^{-}=Fe(SCN)_3 Fe+3+3SCN−=Fe(SCN)3