O(m²) 实现等幂求和——伯努利数

等幂求和

伯努利数是以雅各布 ⋅ \cdot 伯努利的名字命名的,我们记
S m ( n ) = ∑ k = 0 n − 1 k m S_m(n) = \sum_{k = 0}^{n - 1} k^m Sm(n)=k=0n1km
伯努利 暴力 算出了前几项,并进行了观察:
S 0 ( n ) = n S 1 ( n ) = 1 2 n 2 − 1 2 n S 2 ( n ) = 1 3 n 3 − 1 2 n 2 + 1 6 n S 3 ( n ) = 1 4 n 4 − 1 2 n 3 + 1 4 n 2 + 0 n S 4 ( n ) = 1 5 n 5 − 1 2 n 4 + 1 3 n 3 + 0 n 2 − 1 30 n S 5 ( n ) = 1 6 n 6 − 1 2 n 5 + 5 12 n 4 + 0 n 3 − 1 12 n 2 + 0 n S 6 ( n ) = 1 7 n 7 − 1 2 n 6 + 1 2 n 5 + 0 n 4 − 1 6 n 3 + 0 n 2 + 1 42 n \begin{array}{ll} S_0(n) = n \\ S_1(n) = \dfrac{1}{2} n^2 - \dfrac{1}{2} n \\ S_2(n) = \dfrac{1}{3} n^3 - \dfrac{1}{2} n^2 + \dfrac{1}{6} n \\ S_3(n) = \dfrac{1}{4} n^4 - \dfrac{1}{2} n^3 + \dfrac{1}{4} n^2 + 0 n \\ S_4(n) = \dfrac{1}{5} n^5 - \dfrac{1}{2} n^4 + \dfrac{1}{3} n^3 + 0 n^2 - \dfrac{1}{30} n \\ S_5(n) = \dfrac{1}{6} n^6 - \dfrac{1}{2} n^5 + \dfrac{5}{12} n^4 + 0 n^3 - \dfrac{1}{12} n^2 + 0n \\ S_6(n) = \dfrac{1}{7} n^7 - \dfrac{1}{2} n^6 + \dfrac{1}{2} n^5 + 0 n^4 - \dfrac{1}{6} n^3 + 0 n^2 + \dfrac{1}{42} n \end{array} S0(n)=nS1(n)=21n221nS2(n)=31n321n2+61nS3(n)=41n421n3+41n2+0nS4(n)=51n521n4+31n3+0n2301nS5(n)=61n621n5+125n4+0n3121n2+0nS6(n)=71n721n6+21n5+0n461n3+0n2+421n
我们发现,在 S m ( n ) S_m(n) Sm(n) 中, n m + 1 n^{m + 1} nm+1 的系数总是 1 m + 1 \dfrac{1}{m +1} m+11 n m n^m nm 的系数是 − 1 2 -\dfrac{1}{2} 21 n m − 1 n^{m - 1} nm1 的系数是 m 12 \dfrac{m}{12} 12m n m − 2 n^{m - 2} nm2 的系数是 0 0 0 n m − 3 n^{m - 3} nm3 的系数是 − m ( m − 1 ) ( m − 2 ) 720 - \dfrac{m (m - 1) (m - 2)}{720} 720m(m1)(m2) n m − 4 n^{m - 4} nm4 的系数是 0 ⋯ ⋯ 0\cdots\cdots 0 n m − k n^{m - k} nmk 的系数总是某个常数乘上 m k ‾ = m ! ( m − k ) ! m^{\underline{k}} = \dfrac{m!}{(m - k)!} mk=(mk)!m!

递推公式

根据伯努利的发现(值得一提的是,他并没有给出证明),我们有
S m ( n ) = 1 m + 1 ∑ k = 0 m ( m + 1 k ) B k n m + 1 − k S_m(n) = \dfrac{1}{m + 1} \sum_{k = 0}^m \dbinom{m + 1}{k} B_k n^{m + 1 - k} Sm(n)=m+11k=0m(km+1)Bknm+1k
其中 B n B_n Bn 为伯努利数,其由一个递归关系定义:
∑ k = 0 m ( m + 1 k ) B k = [ m = 0 ] \sum_{k = 0}^m \dbinom{m + 1}{k} B_k = [m = 0] k=0m(km+1)Bk=[m=0]
其实你也可以写成
B 0 = 1 ∑ k = 0 m ( m + 1 k ) B k = 0 , m ≥ 1 B_0 = 1 \\ \sum_{k = 0}^m \dbinom{m + 1}{k} B_k = 0, m \ge 1 B0=1k=0m(km+1)Bk=0,m1
这样方便你进行计算。

根据手算,不难得出前几个值:

n n n 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 12
B n B_n Bn 1 1 1 − 1 2 -\dfrac{1}{2} 21 1 6 \dfrac{1}{6} 61 0 0 0 − 1 30 -\dfrac{1}{30} 301 0 0 0 1 42 \dfrac{1}{42} 421 0 0 0 − 1 30 -\dfrac{1}{30} 301 0 0 0 5 66 \dfrac{5}{66} 665 0 0 0 − 691 2730 -\dfrac{691}{2730} 2730691

(其中 B 12 B_{12} B12 这个奇怪分数的出现真是给那些有关 B n B_n Bn 的简单封闭形式的猜想泼冷水。)

证明:

首先令
S ^ m ( n ) = 1 m + 1 ∑ k = 0 m ( m + 1 k ) B k n m + 1 − k \hat{S}_m(n) = \dfrac{1}{m + 1} \sum_{k = 0}^m \dbinom{m + 1}{k} B_k n^{m + 1 - k} S^m(n)=m+11k=0m(km+1)Bknm+1k
那么现在我们就是要证明 S m ( n ) = S ^ m ( n ) S_m(n) = \hat{S}_m(n) Sm(n)=S^m(n),考虑使用数学归纳法。

首先
S 0 ( n ) = ∑ i = 0 n − 1 n 0 = n S ^ 0 ( n ) = 1 1 ( 1 0 ) B 0 n 1 = n \begin{array}{ll} S_0(n) = \sum\limits_{i = 0}^{n - 1} n^0 = n \\ \hat{S}_0(n) = \dfrac{1}{1} \dbinom{1}{0} B_0 n^{1} = n \end{array} S0(n)=i=0n1n0=nS^0(n)=11(01)B0n1=n

S m + 1 ( n ) + n m + 1 = ∑ k = 0 n k m + 1 = ∑ k = 0 n − 1 ( k + 1 ) m + 1 = ∑ k = 0 n − 1 ∑ j = 0 m + 1 ( m + 1 j ) k j = ∑ j = 0 m + 1 ( m + 1 j ) ∑ k = 0 n − 1 k j = ∑ j = 0 m + 1 ( m + 1 j ) S j ( n ) \begin{aligned} S_{m + 1}(n) + n^{m + 1} & = \sum_{k = 0}^n k^{m + 1} \\ & = \sum_{k = 0}^{n - 1} (k + 1)^{m + 1} \\ & = \sum_{k = 0}^{n - 1} \sum_{j = 0}^{m + 1} \dbinom{m + 1}{j} k^j \\ & = \sum_{j = 0}^{m + 1} \dbinom{m + 1}{j} \sum_{k = 0}^{n - 1} k^j \\ & = \sum_{j = 0}^{m + 1} \dbinom{m + 1}{j} S_j(n) \end{aligned} Sm+1(n)+nm+1=k=0nkm+1=k=0n1(k+1)m+1=k=0n1j=0m+1(jm+1)kj=j=0m+1(jm+1)k=0n1kj=j=0m+1(jm+1)Sj(n)

m ≥ 1 m\ge 1 m1 时,假设 ∀ i ∈ [ 0 , m ) \forall i \in [0, m) i[0,m) 均有 S i ( n ) = S ^ i ( n ) S_i(n) = \hat{S}_i(n) Si(n)=S^i(n),将 S m + 1 ( n ) S_{m +1}(n) Sm+1(n) 移项:
n m + 1 = ∑ j = 0 m + 1 ( m + 1 j ) S j ( n ) − S m + 1 ( n ) = ∑ j = 0 m ( m + 1 j ) S j ( n ) = ∑ j = 0 m − 1 ( m + 1 j ) S j ( n ) + ( m + 1 m ) S m ( n ) = ∑ j = 0 m − 1 ( m + 1 j ) S ^ j ( n ) + ( m + 1 ) S m ( n ) \begin{aligned} n^{m + 1} & = \sum_{j = 0}^{m + 1} \dbinom{m + 1}{j} S_j(n) - S_{m + 1}(n) \\ & = \sum_{j = 0}^m \dbinom{m + 1}{j} S_j(n) \\ & = \sum_{j = 0}^{m - 1} \dbinom{m + 1}{j} S_j(n) + \dbinom{m + 1}{m} S_m(n) \\ & = \sum_{j = 0}^{m - 1} \dbinom{m + 1}{j} \hat{S}_j(n) + (m + 1) S_m(n) \end{aligned} nm+1=j=0m+1(jm+1)Sj(n)Sm+1(n)=j=0m(jm+1)Sj(n)=j=0m1(jm+1)Sj(n)+(mm+1)Sm(n)=j=0m1(jm+1)S^j(n)+(m+1)Sm(n)

Δ = S m ( n ) − S ^ m ( n ) \Delta = S_m(n) - \hat{S}_m(n) Δ=Sm(n)S^m(n)
那么现在就是要证 Δ = 0 \Delta = 0 Δ=0
n m + 1 = [ ∑ j = 0 m − 1 ( m + 1 j ) S ^ j ( n ) + ( m + 1 ) S ^ m ( n ) ] + ( m + 1 ) S m ( n ) − ( m + 1 ) S ^ m ( n ) = ∑ j = 0 m ( m + 1 j ) S ^ j ( n ) + ( m + 1 ) Δ \begin{aligned} n^{m + 1} & = \left[\sum_{j = 0}^{m - 1} \dbinom{m + 1}{j} \hat{S}_j(n) + (m + 1) \hat{S}_m(n) \right] + (m + 1) S_m(n) - (m + 1) \hat{S}_m(n) \\ & = \sum_{j = 0}^m \dbinom{m + 1}{j} \hat{S}_j(n) + (m + 1) \Delta \end{aligned} nm+1=[j=0m1(jm+1)S^j(n)+(m+1)S^m(n)]+(m+1)Sm(n)(m+1)S^m(n)=j=0m(jm+1)S^j(n)+(m+1)Δ
根据 S ^ m ( n ) \hat{S}_m(n) S^m(n) 的定义将其展开,有
n m + 1 = ∑ j = 0 m ( m + 1 j ) 1 j + 1 ∑ k = 0 j ( j + 1 k ) B k n j + 1 − k + ( m + 1 ) Δ n^{m + 1} = \sum_{j = 0}^m \dbinom{m +1}{j} \dfrac{1}{j + 1} \sum_{k = 0}^j \dbinom{j + 1}{k} B_k n^{j + 1 - k} + (m + 1) \Delta nm+1=j=0m(jm+1)j+11k=0j(kj+1)Bknj+1k+(m+1)Δ
k k k 改为倒序枚举 并 利用 对称恒等式

( n m ) = ( n n − m ) , n ∈ N , k ∈ Z \dbinom{n}{m} = \dbinom{n}{n - m}, n\in \mathbb{N}, k \in \mathbb{Z} (mn)=(nmn),nN,kZ
n m + 1 = ∑ j = 0 m ( m + 1 j ) 1 j + 1 ∑ k = 0 j ( j + 1 j − k ) B j − k n k + 1 + ( m + 1 ) Δ = ∑ j = 0 m ( m + 1 j ) 1 j + 1 ∑ k = 0 j ( j + 1 k + 1 ) B j − k n k + 1 + ( m + 1 ) Δ \begin{aligned} n^{m +1} & = \sum_{j = 0}^m \dbinom{m + 1}{j} \dfrac{1}{j + 1} \sum_{k = 0}^j \dbinom{j + 1}{j - k} B_{j - k} n^{k + 1} + (m + 1) \Delta \\ & = \sum_{j = 0}^m \dbinom{m + 1}{j} \dfrac{1}{j + 1} \sum_{k = 0}^j \dbinom{j + 1}{k + 1} B_{j - k} n^{k + 1} + (m + 1) \Delta \end{aligned} nm+1=j=0m(jm+1)j+11k=0j(jkj+1)Bjknk+1+(m+1)Δ=j=0m(jm+1)j+11k=0j(k+1j+1)Bjknk+1+(m+1)Δ
利用 吸收恒等式
( r k ) = r k ( r − 1 k − 1 ) , k ∈ Z , k ≠ 0 \dbinom{r}{k} = \dfrac{r}{k} \dbinom{r - 1}{k - 1}, k \in \mathbb{Z}, k \ne 0 (kr)=kr(k1r1),kZ,k=0

n m + 1 = ∑ j = 0 m ( m + 1 j ) 1 j + 1 ∑ k = 0 j j + 1 k + 1 ( j k ) B j − k n k + 1 + ( m + 1 ) Δ = ∑ j = 0 m ( m + 1 j ) ∑ k = 0 j n k + 1 k + 1 ( j k ) B j − k + ( m + 1 ) Δ = ∑ k = 0 m n k + 1 k + 1 ∑ j = k m ( m + 1 j ) ( j k ) B j − k + ( m + 1 ) Δ \begin{aligned} n^{m + 1} & = \sum_{j = 0}^m \dbinom{m + 1}{j} \dfrac{1}{j + 1} \sum_{k = 0}^j \dfrac{j + 1}{k + 1} \dbinom{j}{k} B_{j - k} n^{k + 1} + (m +1) \Delta \\ & = \sum_{j = 0}^m \dbinom{m + 1}{j} \sum_{k = 0}^j \dfrac{n^{k + 1}}{k + 1} \dbinom{j}{k} B_{j - k} + (m + 1) \Delta \\ & = \sum_{k = 0}^m \dfrac{n^{k + 1}}{k + 1} \sum_{j = k}^m \dbinom{m + 1}{j} \dbinom{j}{k} B_{j - k} + (m + 1) \Delta \end{aligned} nm+1=j=0m(jm+1)j+11k=0jk+1j+1(kj)Bjknk+1+(m+1)Δ=j=0m(jm+1)k=0jk+1nk+1(kj)Bjk+(m+1)Δ=k=0mk+1nk+1j=km(jm+1)(kj)Bjk+(m+1)Δ

利用 三项式版恒等式
( r m ) ( m k ) = ( r k ) ( r − k m − k ) \dbinom{r}{m} \dbinom{m}{k} = \dbinom{r}{k} \dbinom{r - k}{m - k} (mr)(km)=(kr)(mkrk)

n m + 1 = ∑ k = 0 m n k + 1 k + 1 ∑ j = k m ( m + 1 k ) ( m − k + 1 j − k ) B j − k + ( m + 1 ) Δ = ∑ k = 0 m n k + 1 k + 1 ( m + 1 k ) ∑ j = k m ( m − k + 1 j − k ) B j − k + ( m + 1 ) Δ \begin{aligned} n^{m + 1} & = \sum_{k = 0}^m \dfrac{n^{k + 1}}{k + 1} \sum_{j = k}^m \dbinom{m + 1}{k} \dbinom{m - k + 1}{j - k} B_{j - k} + (m + 1) \Delta \\ & = \sum_{k = 0}^m \dfrac{n^{k + 1}}{k + 1} \dbinom{m + 1}{k} \sum_{j = k}^m \dbinom{m - k + 1}{j - k} B_{j - k} + (m + 1) \Delta \end{aligned} nm+1=k=0mk+1nk+1j=km(km+1)(jkmk+1)Bjk+(m+1)Δ=k=0mk+1nk+1(km+1)j=km(jkmk+1)Bjk+(m+1)Δ

j − k j - k jk 改为 j j j
n m + 1 = ∑ k = 0 m n k + 1 k + 1 ( m + 1 k ) ∑ j = 0 m − k ( m − k + 1 j ) B j + ( m + 1 ) Δ n^{m + 1} = \sum_{k = 0}^m \dfrac{n^{k + 1}}{k + 1} \dbinom{m + 1}{k} \sum_{j = 0}^{m - k} \dbinom{m - k + 1}{j} B_j + (m + 1) \Delta nm+1=k=0mk+1nk+1(km+1)j=0mk(jmk+1)Bj+(m+1)Δ
又根据伯努利数的递归定义
∑ k = 0 m ( m + 1 k ) B k = [ m = 0 ] \sum_{k = 0}^m \dbinom{m + 1}{k} B_k = [m = 0] k=0m(km+1)Bk=[m=0]

n m + 1 = ∑ k = 0 m n k + 1 k + 1 ( m + 1 k ) [ m − k = 0 ] + ( m + 1 ) Δ = n m + 1 m + 1 ( m + 1 m ) + ( m + 1 ) Δ = n m + 1 + ( m + 1 ) Δ \begin{aligned} n^{m + 1} & = \sum_{k = 0}^m \dfrac{n^{k + 1}}{k + 1} \dbinom{m + 1}{k} [m - k = 0] + (m + 1) \Delta \\ & = \dfrac{n^{m + 1}}{m + 1} \dbinom{m + 1}{m} + (m + 1) \Delta \\ & = n^{m + 1} + (m + 1) \Delta \end{aligned} nm+1=k=0mk+1nk+1(km+1)[mk=0]+(m+1)Δ=m+1nm+1(mm+1)+(m+1)Δ=nm+1+(m+1)Δ

啊哈!至此,我们推出了
( m + 1 ) Δ = 0 ∵ m + 1 ≠ 0 ∴ Δ = 0 (m + 1) \Delta = 0 \\ \because m + 1 \ne 0 \\ \therefore \Delta = 0 (m+1)Δ=0m+1=0Δ=0
证完喽!

当然,还有一种用 指数生成函数 的更简单的证明方法,因为笔者才疏学浅不会生成函数就先不证了,到时候在生成函数的笔记里证(

代码实现

显然这东西一般用在有模数的情况下。

下列代码计算的是 ∑ k = 0 n k m \sum\limits_{k = 0}^n k^m k=0nkm,因此需要 n++;

时间复杂度为 O ( m 2 ) \Omicron(m^2) O(m2)

暴力计算的时间为 O ( n log ⁡ m ) \Omicron(n\log m) O(nlogm),在 n n n 巨大时伯努利数有巨大优势,参见 P6271 [湖北省队互测2014]一个人的数论 使用莫反 + 伯努利数或时间复杂度同级的拉格朗日插值。

//18 = 9 + 9 = 18.
#include <iostream>
#include <cstdio>
#define Debug(x) cout << #x << "=" << x << endl
typedef long long ll;
using namespace std;

const int MAXN = 1e4 + 5;
const int N = 1e4;
const int MOD = 1e9 + 7;

int add(int a, int b) {return (a + b) % MOD;}
int mul(int a, int b) {return (ll)a * b % MOD;}

int inv[MAXN], C[MAXN][MAXN], B[MAXN];

void init()
{
	for (int i = 0; i <= N; i++)
	{
		C[i][0] = C[i][i] = 1;
	}
	for (int i = 1; i <= N; i++)
	{
		for (int j = 1; j < i; j++)
		{
			C[i][j] = add(C[i - 1][j], C[i - 1][j - 1]);
		}
	}
	
	inv[1] = 1;
	for (int i = 2; i <= N + 1; i++)
	{
		inv[i] = mul(MOD - MOD / i, inv[MOD % i]);
	}
	
	B[0] = 1;
	for (int m = 1; m <= N; m++)
	{
		int sum = 0;
		for (int k = 0; k < m; k++)
		{
			sum = add(sum, mul(C[m + 1][k], B[k]));
		}
		B[m] = mul(MOD - sum, inv[m + 1]);
	}
}

int qpow(int a, int b)
{
	int base = a, ans = 1;
	while (b)
	{
		if (b & 1)
		{
			ans = mul(ans, base);
		}
		base = mul(base, base);
		b >>= 1;
	}
	return ans;
}

int main()
{
	init(); // 计算伯努利数 
	int n, m;
	scanf("%d%d", &n, &m);
	n++;
	int res = 0;
	for (int k = 0; k <= m; k++)
	{
		res += mul(mul(C[m + 1][k], B[k]), qpow(n, m + 1 - k));
	}
	printf("%d\n", mul(inv[m + 1], res));
	return 0;
}

参考资料

  • [1] 伯努利数. OI-wiki
  • [2] Concrete Mathematics 5.1 BASIC IDENTITIES, 6.5 BERNOULLI NUMBER. Ronald L. Graham, Donald E. Knuth, Oren Patashnik.
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值