1.普通生成函数
OGF
\texttt{OGF}
OGF
对于无顺序的计数
f
(
x
)
=
∑
i
=
0
a
i
x
i
f(x) = \sum_{i=0} a_ix^i
f(x)=i=0∑aixi
这里的
x
x
x是形式幂级数,我们不关心
x
x
x的具体取值,我们只关心系数,可以通过复分析证明可以无视收敛条件化简:
∑
i
=
0
x
i
=
1
1
−
x
\sum_{i=0} x^i = \frac 1{1-x}
∑i=0xi=1−x1
Ex1
:
求出
Ai
=
i*i
的生成函数
\texttt{Ex1 : 求出 Ai = i*i 的生成函数}
Ex1 : 求出 Ai = i*i 的生成函数
考虑
f
(
x
)
=
∑
i
=
0
i
x
i
=
∑
i
=
1
x
i
∑
j
=
0
x
j
=
x
1
−
x
⋅
1
1
−
x
f(x) = \sum_{i=0} ix^i = \sum_{i=1}x^i\sum_{j=0}x^j = \frac x{1-x} \cdot\frac 1{1-x}
f(x)=∑i=0ixi=∑i=1xi∑j=0xj=1−xx⋅1−x1
∴
A
(
x
)
=
∑
i
=
0
i
∗
i
x
i
=
∑
i
=
0
(
i
−
1
)
i
x
i
+
i
x
i
=
x
(
1
−
x
)
2
+
∑
i
=
2
x
i
∑
j
=
0
j
x
j
=
x
(
1
−
x
)
2
+
x
2
1
−
x
⋅
x
(
1
−
x
)
2
=
x
3
−
x
2
+
x
(
1
−
x
)
3
\therefore A(x) = \sum_{i=0} i*ix^i = \sum_{i=0} (i-1)ix^i + ix^i \\= \frac x{(1-x)^2} + \sum_{i=2} x^i\sum_{j=0}jx^j \\=\frac x{(1-x)^2} + \frac {x^2}{1-x} \cdot \frac x{(1-x)^2} = \frac {x^3-x^2+x}{(1-x)^3}
∴A(x)=i=0∑i∗ixi=i=0∑(i−1)ixi+ixi=(1−x)2x+i=2∑xij=0∑jxj=(1−x)2x+1−xx2⋅(1−x)2x=(1−x)3x3−x2+x
A
n
=
2
n
x
n
A_n=2^nx^n
An=2nxn的生成函数:
1
1
−
2
x
\frac 1{1-2x}
1−2x1
A
=
{
1
,
0
,
1
,
0
,
.
.
.
.
}
A=\{1,0,1,0,....\}
A={1,0,1,0,....}:
1
1
−
x
2
\frac 1{1-x^2}
1−x21
A
=
{
0
,
1
,
0
,
1
,
.
.
.
.
}
A=\{0,1,0,1,....\}
A={0,1,0,1,....}:
x
1
−
x
2
\frac x{1-x^2}
1−x2x
A
i
=
i
−
1
A_i=i-1
Ai=i−1的生成函数:
d
(
1
1
−
x
)
d
x
=
1
(
1
−
x
)
2
\frac {\mathrm d(\frac 1{1-x})}{\mathrm d x}=\frac 1{(1-x)^2}
dxd(1−x1)=(1−x)21
2.指数生成函数
对于有顺序的计数。
f
(
x
)
=
∑
i
=
0
a
i
x
i
i
!
f(x) = \sum_{i=0} \frac {a_ix^i}{i!}
f(x)=∑i=0i!aixi
卷积时自带排列。
A
i
=
i
!
A_i=i!
Ai=i!的指数生成函数:
P
(
x
)
=
1
1
−
x
P(x) = \frac 1{1-x}
P(x)=1−x1
A
i
=
(
i
−
1
)
!
A_i=(i-1)!
Ai=(i−1)!的指数生成函数:
C
(
x
)
=
ln
1
1
−
x
C(x) = \ln\frac {1}{1-x}
C(x)=ln1−x1
P
(
x
)
=
e
C
(
x
)
P(x) = e^{C(x)}
P(x)=eC(x)
组合意义,排列(置换)可以分解成多个环排列。
错排方案数:
D
(
x
)
=
e
C
(
x
)
−
x
=
e
−
x
1
−
x
D(x) = e^{C(x)-x}=\frac {e^{-x}}{1-x}
D(x)=eC(x)−x=1−xe−x,即多个没有自环的环排列。
关于多项式
e
x
p
(
F
(
x
)
)
exp(F(x))
exp(F(x))的意义,其中
F
(
x
)
=
∑
i
f
i
x
i
i
!
F(x) = \sum_{i} f_i\frac {x^i}{i!}
F(x)=∑ifii!xi:
f
i
f_i
fi是有标号的计数。
G
(
x
)
=
e
x
p
(
F
(
x
)
)
=
∑
i
F
(
x
)
i
i
!
G(x) = exp(F(x)) = \sum_{i} \frac{F(x)^i}{i!}
G(x)=exp(F(x))=∑ii!F(x)i
得出来的
G
(
x
)
=
∑
i
g
i
x
i
i
!
G(x)=\sum_{i} g_i\frac {x^i}{i!}
G(x)=∑igii!xi中,
g
i
g_i
gi也是有标号的计数。
那么
e
x
p
exp
exp中相当于 把
n
n
n个标号分到
n
n
n个点但是这
n
n
n个点分成了
i
i
i个集合,每个集合内部的标号方案被
F
(
x
)
F(x)
F(x)限定住了,所以每个集合的点可以看作一样的点,
n
n
n个点但是有相同颜色的点,给这些点分配标号。
F
(
x
)
i
i
!
\frac{F(x)^i}{i!}
i!F(x)i相当于提取出来把
n
n
n个点分成
i
i
i个集合,标号已经被上面的所述的指数函数的性质统计了,那么这
i
i
i个集合实际上是没有顺序限制的,但是
F
(
x
)
i
F(x)^i
F(x)i中是有顺序限制的(注意到因为要分配标号,所以
F
(
x
)
F(x)
F(x)中相同的两种分配标号方式在这一步是不同的),直接除上
i
!
i!
i!。
3.FFT
4.循环卷积。
5.二维循环卷积
参考多维
DFT
\texttt{DFT}
DFT
6.bluestein算法
https://blog.youkuaiyun.com/outer_form/article/details/52386685
计算n位循环卷积的方法。
(
m
o
d
1163962801
)
\pmod{1163962801}
(mod1163962801)
这是1~22的
l
c
m
lcm
lcm,他有2到22次单位根,可以直接在模意义下的环内用整数做
DFT
\texttt{DFT}
DFT
7.单位根反演。
我博客里有。
一个图中,求走过步数i为
K
K
K的倍数的路径的
(
n
i
)
\binom{n}{i}
(in)之和。
首先可以让每个点连一个自环,那么长度为i的路径到n时就会选择n-i个时刻走自环,那么就可以解决这个组合数了。
然后直接上单位根反演,把走一步后乘上
w
n
i
,
i
∈
[
0
,
K
−
1
]
w_n^i,i\in[0,K-1]
wni,i∈[0,K−1] 加起来除以
K
K
K就行了。
其实也可以矩阵中每个元素维护一个 K − 1 K-1 K−1次多项式,然后做长度为 K K K的循环卷积,最后插值回去,并无大差异。
8.Polya生成函数
有一个长度为
n
n
n的项链,
m
m
m种颜色。
求对于颜色
i
i
i用了
C
i
C_i
Ci个的在旋转置换下的等价类数。
对于置换(移动
p
p
p位)的不动点的生成函数:
f
p
(
x
1
,
x
2
,
x
3
.
.
x
m
)
=
(
∑
i
=
1
m
x
i
g
c
d
(
p
,
n
)
)
n
g
c
d
(
p
,
n
)
f_p(x_1,x_2,x_3..x_m) = (\sum_{i=1}^m x_i^{gcd(p,n)})^{\frac n{gcd(p,n)}}
fp(x1,x2,x3..xm)=(∑i=1mxigcd(p,n))gcd(p,n)n
对于等价类的生成函数:
F
(
x
1
,
x
2
.
.
.
.
x
m
)
=
∑
p
f
p
(
x
1
,
x
2
.
.
.
x
m
)
n
F(x_1,x_2....x_m) = \frac {\sum_p f_p(x_1,x_2...x_m)}n
F(x1,x2....xm)=n∑pfp(x1,x2...xm)
算就是了。
9.多项式可以执行的操作
Ⅰ:多项式牛顿迭代:
对于
f
(
x
)
f(x)
f(x)展开一阶即认为
f
(
x
)
=
f
(
x
0
)
+
f
′
(
x
0
)
∗
(
x
−
x
0
)
f(x) = f(x_0) + f'(x_0) * (x-x_0)
f(x)=f(x0)+f′(x0)∗(x−x0)。
然后求
f
(
x
)
=
0
f(x) = 0
f(x)=0的
x
x
x的解。
x
=
f
′
(
x
0
)
−
f
(
x
0
)
f
′
(
x
0
)
x = f'(x_0) - \frac {f(x_0)}{f'(x_0)}
x=f′(x0)−f′(x0)f(x0)
不断用
x
0
x_0
x0求出新的
x
x
x,把
x
0
=
x
x_0 = x
x0=x,如果
f
(
x
)
=
0
f(x)= 0
f(x)=0则结束。
对于多项式我们来抽象的实现牛顿迭代。
A
(
x
)
=
f
′
(
B
(
x
)
)
−
f
(
B
(
x
)
)
f
′
(
B
(
x
)
)
A(x) = f'(B(x)) - \frac {f(B(x))}{f'(B(x))}
A(x)=f′(B(x))−f′(B(x))f(B(x))
每次多项式长度都会*2.
Ⅱ:多项式求逆:
A
(
x
)
=
1
B
(
x
)
A(x) = \frac 1{B(x)}
A(x)=B(x)1
注意把
A
(
x
)
−
1
B
(
x
)
=
0
A(x) - \frac 1{B(x)} = 0
A(x)−B(x)1=0牛顿迭代是有坑点的,需要特殊理解。
ⅠⅠⅠ:多项式除法。
A
(
x
)
=
B
(
x
)
C
(
x
)
+
D
(
x
)
A(x) = B(x)C(x) + D(x)
A(x)=B(x)C(x)+D(x)
A
(
1
x
)
=
B
(
1
x
)
C
(
1
x
)
+
D
(
1
x
)
A(\frac 1x) = B(\frac 1x)C(\frac 1x) + D(\frac 1x)
A(x1)=B(x1)C(x1)+D(x1)
x
d
e
g
(
A
)
A
(
1
x
)
=
x
d
e
g
(
B
)
B
(
1
x
)
x
d
e
g
(
C
)
C
(
1
x
)
+
x
d
e
g
(
A
)
D
(
1
x
)
x^{deg(A)} A(\frac 1x) = x^{deg(B)}B(\frac 1x)x^{deg(C)}C(\frac 1x) + x^{deg(A)}D(\frac 1x)
xdeg(A)A(x1)=xdeg(B)B(x1)xdeg(C)C(x1)+xdeg(A)D(x1)
最后一项因为
d
e
g
(
D
)
<
d
e
g
(
B
)
deg(D) < deg(B)
deg(D)<deg(B)所以在
(
m
o
d
x
d
e
g
(
A
)
−
d
e
g
(
B
)
+
1
)
\pmod {x^{deg(A)-deg(B)+1}}
(modxdeg(A)−deg(B)+1)的意义下是0.
对于A,B,C都只相当于把多项式的系数反转。
那么就可以算出C,然后算出
D
D
D.
Ⅳ:多项式多点求值:
对于
f
(
x
)
=
s
u
m
i
=
0
n
a
i
x
i
f(x)= \ sum_{i=0}^n a_ix^i
f(x)= sumi=0naixi求
f
(
x
1
)
,
f
(
x
2
)
.
.
.
f
(
x
m
)
f(x_1),f(x_2)...f(x_m)
f(x1),f(x2)...f(xm)
设一个多项式
π
(
i
,
j
)
=
∏
i
j
(
x
−
x
i
)
\pi(i,j) = \prod_{i}^j (x-x_i)
π(i,j)=∏ij(x−xi)
若
f
(
x
)
≡
g
(
x
)
(
m
o
d
π
(
1
,
k
)
)
f(x) \equiv g(x) \pmod{\pi(1,k)}
f(x)≡g(x)(modπ(1,k))
所以因为
f
(
x
i
)
=
f
(
x
)
(
m
o
d
x
−
x
i
)
=
g
(
x
i
)
f(x_i) = f(x) \pmod {x-x_i} = g(x_i)
f(xi)=f(x)(modx−xi)=g(xi)
这样就可以类线段树分治,每次两个多项式取模把多项式次数减半。
V:多项式快速插值
用多项式科技优化拉格朗日插值。
发现可以直接分治,左半插值,右半插值,
f
l
,
r
=
f
l
,
m
i
d
π
m
i
d
+
1
,
r
+
f
m
i
d
+
1
,
r
π
l
,
m
i
d
f_{l,r} = f_{l,mid}\pi_{mid+1,r} + f_{mid+1,r}\pi_{l,mid}
fl,r=fl,midπmid+1,r+fmid+1,rπl,mid ,两个
log
\log
log美滋滋。但是初值需要知道
y
i
=
F
(
x
i
)
∏
j
!
=
i
(
x
i
−
x
j
)
y_i = \frac {F(x_i)}{\prod_{j!=i} (x_i-x_j)}
yi=∏j!=i(xi−xj)F(xi)。
设
P
i
(
x
)
=
∏
j
(
x
−
x
j
)
(
x
−
x
i
)
P_i(x) = \frac {\prod_j(x-x_j)}{(x-x_i)}
Pi(x)=(x−xi)∏j(x−xj)
那么
y
i
=
F
(
x
i
)
P
i
(
x
i
)
y_i = \frac {F(x_i)}{P_i(x_i)}
yi=Pi(xi)F(xi)
那么我们就需要算出
P
i
(
x
i
)
P_i(x_i)
Pi(xi)。
以小学生的素养知道分母为0 ,再用小学生就应该会的微积分中的洛必达法则得出
P
i
(
x
i
)
=
(
∏
j
(
x
−
x
j
)
)
′
−
x
i
P_i(x_i) = \frac {(\prod_j(x-x_j))'}{-x_i}
Pi(xi)=−xi(∏j(x−xj))′
对分子多项式多点求值就行了。
E
x
1
:
分
拆
数
Ex1:分拆数
Ex1:分拆数
求对于
n
n
n的不下降可重分拆方案数。
不是五边形数的那个!!!!
推式子后
e
x
p
exp
exp
注意EGF的组合意义不要乱用。
…
开始线代?
范德蒙德矩阵
它的行列式
∏
j
<
i
(
x
i
−
x
j
)
\prod_{j<i} (x_i-x_j)
∏j<i(xi−xj)可以用巧妙一下用多点求值。
Ex2
\texttt{Ex2}
Ex2
给出
f
(
x
)
=
∏
i
=
0
n
(
1
−
a
i
x
i
)
f(x) = \prod_{i=0}^n (1-a_ix^i)
f(x)=∏i=0n(1−aixi),
g
(
x
)
=
∏
i
=
0
n
(
1
−
b
i
x
i
)
g(x) = \prod_{i=0}^n (1-b_ix^i)
g(x)=∏i=0n(1−bixi)
求
h
(
x
)
=
∏
i
=
0
n
∏
j
=
0
n
(
1
−
a
i
b
j
x
i
+
j
)
h(x) = \prod_{i=0}^n\prod_{j=0}^n (1-a_ib_jx^{i+j})
h(x)=∏i=0n∏j=0n(1−aibjxi+j)
泰勒展开
l
n
(
f
(
x
)
)
=
∑
k
>
0
(
−
1
)
k
−
1
k
x
k
(
∑
i
=
0
n
a
i
k
)
ln(f(x)) = \sum_{k>0} \frac {(-1)^{k-1}}{k}x^k(\sum_{i=0}^na_i^k)
ln(f(x))=∑k>0k(−1)k−1xk(∑i=0naik)
l
n
(
h
(
x
)
)
=
∑
k
>
0
(
−
1
)
k
−
1
k
x
k
(
∑
i
=
0
n
∑
j
=
0
n
a
i
k
b
j
k
)
ln(h(x)) = \sum_{k>0} \frac {(-1)^{k-1}}kx^k(\sum_{i=0}^n\sum_{j=0}^na_i^kb_j^k)
ln(h(x))=∑k>0k(−1)k−1xk(∑i=0n∑j=0naikbjk)
解出
∑
i
=
0
n
a
i
k
\sum_{i=0}^na_i^k
∑i=0naik,
∑
i
=
0
n
b
i
k
\sum_{i=0}^nb_i^k
∑i=0nbik就可以直接推出
ln
(
h
(
x
)
)
\ln(h(x))
ln(h(x))
常系数线性递推。