一般求法
一般求自然数幂和都会用到拉格朗日插值法,但仅当存在逆元的时候能用,给出一种用第二类斯特林数求自然数幂和的方法,时间复杂度是
O(k2)
O
(
k
2
)
而不是
O(k log k)
O
(
k
l
o
g
k
)
的。
第二类斯特林数
众所周知,有
ik=∑j=0k{kj}ij–
i
k
=
∑
j
=
0
k
{
k
j
}
i
j
_
于是乎我们有
F(n)=∑i=1nik=∑i=1n∑j=0k{kj}ij–
F
(
n
)
=
∑
i
=
1
n
i
k
=
∑
i
=
1
n
∑
j
=
0
k
{
k
j
}
i
j
_
F(n)=∑i=1n∑j=0k{kj}j!(ij)
F
(
n
)
=
∑
i
=
1
n
∑
j
=
0
k
{
k
j
}
j
!
(
i
j
)
F(n)=∑j=0k{kj}j!∑i=jn(ij)
F
(
n
)
=
∑
j
=
0
k
{
k
j
}
j
!
∑
i
=
j
n
(
i
j
)
我们又有
∑i=jn(ij)=(n+1j+1)
∑
i
=
j
n
(
i
j
)
=
(
n
+
1
j
+
1
)
证明可以考虑组合意义,把
n
n
+
1个数排成一排,考虑第一个选的数的位置,剩下的数中再选
j
j
个,就能得到上面的式子。
当然也可以用
(ij)=(i−1j−1)+(i−1j)此式子依次展开上式即可。
接着式子就变成了
F(n)=∑j=0k{kj}j!(n+1j+1)
F
(
n
)
=
∑
j
=
0
k
{
k
j
}
j
!
(
n
+
1
j
+
1
)
F(n)=∑j=0k{kj}(n+1)j+1––––j+1
F
(
n
)
=
∑
j
=
0
k
{
k
j
}
(
n
+
1
)
j
+
1
_
j
+
1
很明显
(n+1)j+1––––j+1
(
n
+
1
)
j
+
1
_
j
+
1
一定是整数,因此就不需要逆元了,第二类斯特林数用
O(k2)
O
(
k
2
)
计算出来,时间复杂度
O(k2)
O
(
k
2
)
。