自然数幂和

定义与约定

[Large S_k(n)=sum_{i=0}^{n-1}i^k ]

注意是一直加到 ((n-1)^k),不是 (n^k)

忽略了部分下取整符号。

扰动法

[S_k(n)=sum_{i=0}^{n-1}i^k ]

[=sum_{i=0}^{n-1}(i+1)^k - n^k ]

[=sum_{i=0}^{n-1} sum_{d=0}^k{k choose d}i^d - n^k ]

[=sum_{d=0}^k {k choose d}sum_{i=0}^{n-1}i^d - n^k ]

[= sum_{d=0}^k {k choose d}S_d(n)-n^k ]

[= S_k(n) + kS_{k-1}(n) - n^k + sum_{d = 0}^{k-2}{k choose d}S_d(n) ]

移项:

[S_{k-1}(n)=1/k*(n^k-sum_{d=0}^{k-2}{k choose d}S_d(n)) ]

[S_k(n)=frac{n^{k+1}-sum_{d=0}^{k-1}{k+1 choose d}S_d(n)}{k+1} ]

复杂度:(O(k^2))

优化:

[S_k(n)=frac{n^{k+1}}{k+1}-k!sum_{d=0}^{k+1}frac{S_d(n)}{d!}(k+1-d)! ]

分治FFT可以做到 (O(klog^2k))

拉格朗日插值

根据常识,(S_k(n)) 是关于 (n)(k+1) 次多项式。于是可以用拉格朗日插值搞。

[large f(x)=sum_{i=1}^{k+2} y_iprod_{j le k+2,j ot= i}frac{x-x_i}{x_j-x_i} ]

发现后面那个的 (x_i) 是连续的,于是可以预处理前缀后缀积加速。复杂度:(O(k))

伯努利数

考虑我们把这 (k+1) 次多项式精确地表示出来。这需要用伯努利数

[Large S_k(n)=frac{1}{k+1} * sum_{i = 0}^{k} {k+1 choose i}B_in^{k-i+1} ]

直接预处理伯努利数后直接插值即可。

复杂度:(O(k^2+qk))

优化:可以用多项式求逆预处理伯努利数,复杂度 (O(klogk+qk))

第二类斯特林数

根据组合意义:

[Large n^m=sum_{i} egin{Bmatrix} m \ i end{Bmatrix} {n choose i}i! ]

于是:

[S_k(n)=sum_{i=0}^{n-1}i^k ]

[=sum_{i=0}^{n-1}sum_{j}egin{Bmatrix} k \ j end{Bmatrix} {i choose j}j!]

[=sum_{j=0}^{k} egin{Bmatrix} k \ j end{Bmatrix} j! sum_{i=0}^{n-1}{i choose j}]

[=sum_{j=0}^k egin{Bmatrix} k \ j end{Bmatrix}j! {n choose j + 1} ]

然后就可以 (O(k)) 算了。

第一类斯特林数

众所周知,斯特林数擅长普通幂和上升幂/下降幂的转换,而上升幂/下降幂擅长处理类似“前缀和”的问题。所以我们可以尝试用斯特林数来解决自然数幂和问题。

根据组合意义:

[Large x^{overline{n}}=sum_{i=0}^n egin{bmatrix} n\ i end{bmatrix} x^i ]

这个组合意义是:枚举每种将 (n) 分成若干种轮换的方式,并将每个轮换染成 (1...x) 的颜色的方案数,等价于一个一个地加点,每个点既可以选择新建一个轮换,有 (x) 种方案;又可以选择跟在之前的点的后面,方案是 (0...n-1)

感觉不够严谨?我们尝试用数学归纳法证明一下:

[egin{aligned} x^{overline{n-1}}&=sum_{i=0}^{n-1} egin{bmatrix} n-1 \ i end{bmatrix}x^i \ (n+x-1)x^{overline{n-1}}&= sum_{i=0}^{n}(n-1)egin{bmatrix} n-1 \ i end{bmatrix}x^i+sum_{i=0}^negin{bmatrix} n-1 \ i end{bmatrix}x^i \ x^{overline{n}} &= sum_{i=0}^negin{bmatrix} n \ i end{bmatrix}x^i end{aligned} ]

现在我们回到自然数幂和的问题。

[egin{aligned} S_k(n)&=sum_{i=0}^{n-1}i^k\ &= sum_{i=0}^{n-1}i^{overline{k}}-sum_{j=0}^{k-1} egin{bmatrix} k \ j end{bmatrix}i^j\ &= k!sum_{i=0}^{n-1}{i + k - 1 choose k}-sum_{i=0}^{n-1}sum_{j=0}^{k-1} egin{bmatrix} k \ j end{bmatrix}i^j\ &= k! {k + n- 1 choose k + 1}-sum_{j=0}^{k-1}egin{bmatrix} k \ j end{bmatrix}S_j(n)\ &= frac{(n-1)^{overline{k+1}}}{k+1}-sum_{j=0}^{k-1}egin{bmatrix} k \ j end{bmatrix}S_j(n) end{aligned} ]

直接递推即可。复杂度:(O(k^2))。优势在于模数无需为质数

不喜欢上升幂?我们试一试下降幂:

首先应该知道:

[Large x^{overline{n}}=(-1)^n(-x)^{underline{n}} ]

[Large x^{underline{n}}=(-1)^n(-x)^{overline{n}} ]

(显然)

然后代入$x{overline{n}}=sum_{i=0}n egin{bmatrix}
n
i
end{bmatrix} x^i $,硬把它搞成下降幂:

[(-1)^n(-x)^{underline{n}}=sum_{i=0}^n egin{bmatrix} n\ i end{bmatrix} x^i ]

(-x) 代替 (x)

[Large x^{underline{n}}=sum_{i=0}^n egin{bmatrix} n\ i end{bmatrix} (-1)^{n-i}x^i]

用这个搞一搞:

[egin{aligned} S_k(n)&=sum_{i=0}^{n-1}i^k\ &=sum_{i=0}^{n-1}i^{underline{k}}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}i^j\ &= k!sum_{i=0}^{n-1}{i choose k}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}sum_{i=0}^{n-1}i^j\ &= k!{n choose k + 1}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}S_j(n)\ &= frac{n^{underline{k+1}}}{k+1}-sum_{j=0}^{k-1}egin{bmatrix} k\ j end{bmatrix}(-1)^{k-j}S_j(n)\ end{aligned} ]

同样直接递推即可。复杂度同样是 (O(k^2))。优势同样在于模数无需为质数

原文地址:https://www.cnblogs.com/JiaZP/p/13554017.html