概念
[ n k ] n \brack k [kn]表示将 n n n个数的序列划分为 k k k个圆排列的方案数。
递推公式
[
n
k
]
=
[
n
−
1
k
−
1
]
+
[
n
−
1
k
]
×
(
n
−
1
)
{n \brack k}= {{n-1} \brack {k-1}}+{{n-1}\brack k}\times (n-1)
[kn]=[k−1n−1]+[kn−1]×(n−1)
[
n
−
1
k
−
1
]
n-1 \brack k-1
[k−1n−1]表示将最后一个数单独创建一个圆排列的方案数
[ n − 1 k ] × ( n − 1 ) {n-1\brack k}\times (n-1) [kn−1]×(n−1)表示将最后一个数插入前面k个圆排列中的方案数。对每个圆排列,能插入的位置数即为圆排列的大小,所以总的插入位置数为n-1。
多项式表示
[
n
k
]
{n \brack k}
[kn]为多项式
f
n
(
x
)
=
∏
i
=
0
n
−
1
(
x
+
i
)
f_n(x)=\prod_{i=0}^{n-1}(x+i)
fn(x)=∏i=0n−1(x+i)的
k
k
k次项系数。
比较好想:(不严格证明)
n
=
1
n=1
n=1时显然成立。
n
>
1
n>1
n>1时,
f
n
(
x
)
=
(
x
+
n
−
1
)
f
n
−
1
(
x
)
=
x
⋅
f
n
−
1
(
x
)
+
(
n
−
1
)
f
n
−
1
(
x
)
f_n(x)=(x+n-1)f_{n-1}(x)=x\cdot f_{n-1}(x)+(n-1)f_{n-1}(x)
fn(x)=(x+n−1)fn−1(x)=x⋅fn−1(x)+(n−1)fn−1(x)
即,将
f
n
−
1
(
x
)
f_{n-1}(x)
fn−1(x)右移一位,再加上自己的
(
n
−
1
)
(n-1)
(n−1)倍,列个表出来看看。
1
x
x
2
x
3
.
.
.
x
⋅
f
n
−
1
[
n
−
1
0
]
[
n
−
1
1
]
[
n
−
1
2
]
.
.
.
(
n
−
1
)
f
n
−
1
(
n
−
1
)
[
n
−
1
0
]
(
n
−
1
)
[
n
−
1
1
]
(
n
−
1
)
[
n
−
1
2
]
(
n
−
1
)
[
n
−
1
3
]
.
.
.
\begin{array}{c:c:c:c:c:c} \ &1&x&x^2&x^3&...\\\hdashline\\ x\cdot f_{n-1}&\ &{n-1\brack 0}&{n-1\brack 1}&{n-1\brack 2}&... \\\\\hdashline\\ (n-1)f_{n-1}&(n-1){n-1\brack 0}&(n-1){n-1\brack 1}&(n-1){n-1\brack 2}&(n-1){n-1\brack 3}&...\\\\\hdashline \end{array}
x⋅fn−1(n−1)fn−11 (n−1)[0n−1]x[0n−1](n−1)[1n−1]x2[1n−1](n−1)[2n−1]x3[2n−1](n−1)[3n−1].........
对应竖着相加,
x
i
x^i
xi系数正好为
[
n
−
1
i
−
1
]
+
(
n
−
1
)
[
n
−
1
i
]
=
[
n
i
]
{n-1\brack i-1}+(n-1){n-1\brack i}={n\brack i}
[i−1n−1]+(n−1)[in−1]=[in]
倍增求Stirling
利用上面那个多项式,已经可以用分治FFT求出,时间复杂度 O ( n ⋅ log 2 2 n ) O(n\cdot {\log_2}^2n) O(n⋅log22n)
还可以更优秀。
当我们求出
f
n
(
x
)
=
∏
i
=
0
n
−
1
(
x
+
i
)
f_n(x)=\prod_{i=0}^{n-1}(x+i)
fn(x)=∏i=0n−1(x+i),可以更快的求出
g
n
(
x
)
=
∏
i
=
0
n
−
1
(
x
+
n
+
i
)
g_n(x)=\prod_{i=0}^{n-1}(x+n+i)
gn(x)=∏i=0n−1(x+n+i)
这样可得
f
2
n
(
x
)
=
f
n
(
x
)
g
n
(
x
)
f_{2n}(x)=f_n(x)g_n(x)
f2n(x)=fn(x)gn(x)
设
f
n
(
x
)
f_n(x)
fn(x)已求出,
f
n
(
x
)
=
∑
i
=
0
n
a
i
⋅
x
i
f_n(x)=\sum_{i=0}^na_i\cdot x^i
fn(x)=∑i=0nai⋅xi
g
n
(
x
)
=
∑
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
=
∑
j
=
0
n
x
j
j
!
∑
i
=
j
n
(
a
i
⋅
i
!
)
n
i
−
j
(
i
−
j
)
!
=
∑
i
=
0
n
x
i
i
!
∑
j
=
0
n
−
i
(
a
i
+
j
⋅
(
i
+
j
)
!
)
n
j
j
!
\begin{aligned} g_n(x)&=\sum_{i=0}^na_i(x+n)^i \\ &=\sum_{i=0}^n\sum_{j=0}^ia_i{i \choose j}n^{i-j}x^j\\ &=\sum_{i=0}^n\sum_{j=0}^ia_i{\frac {i!} {(i-j)!\cdot j!}}n^{i-j}x^j\\ &=\sum_{j=0}^n\frac {x^j} {j!}\sum_{i=j}^n({a_i}\cdot i!)\frac {n^{i-j}} {(i-j)!}\\ &=\sum_{i=0}^n\frac {x^i} {i!}\sum_{j=0}^{n-i}\big({a_{i+j}}\cdot (i+j)!\big)\frac {n^{j}} {j!} \end{aligned}
gn(x)=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=j=0∑nj!xji=j∑n(ai⋅i!)(i−j)!ni−j=i=0∑ni!xij=0∑n−i(ai+j⋅(i+j)!)j!nj
后面一个求和式满足卷积的形式,将一个多项式设为
∑
i
=
0
n
a
i
(
i
+
j
)
!
⋅
x
i
\sum_{i=0}^na_i(i+j)!\cdot x^i
∑i=0nai(i+j)!⋅xi,另一个多项式设为
∑
i
=
0
n
n
i
i
!
x
n
−
i
\sum_{i=0}^n\frac {n^i} {i!}x^{n-i}
∑i=0ni!nixn−i,两多项式相乘,再左移n位即可。
于是我们可以倍增求解,每次求出
f
n
(
x
)
f_n(x)
fn(x),用
O
(
n
log
2
n
)
O(n\log_2n)
O(nlog2n)的时间计算出
f
2
n
(
x
)
f_{2n}(x)
f2n(x)
总时间复杂度为
T
(
n
)
=
T
(
n
/
2
)
+
O
(
n
log
n
)
=
O
(
n
log
n
)
T(n) = T(n/2) + O(n\log n) = O(n\log n)
T(n)=T(n/2)+O(nlogn)=O(nlogn)
一些能转换为第一类斯特林数的问题
1.求满足此条件排列的方案数:n个数的排列,有m个数满足,这个数在他的前缀中是最大的。
这m个数把n个数分成了m段,每段中,最大数一定在最前面,即每一段内的排列,只有相对位置不同,才算不同的排列,就是圆排列。所以方案数为
[
n
m
]
n\brack m
[mn]。
2.留坑。。。。。。。