定义与约定
[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))。优势同样在于模数无需为质数