等幂求和
伯努利数是以雅各布 ⋅ ⋅ 伯努利的名字命名的,我们记
S m ( n ) = n − 1 ∑ k = 0 k m S m ( n ) = ∑ k = 0 n − 1 k m
伯努利 暴力 算出了前几项,并进行了观察:
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 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
我们发现,在 S m ( n ) S m ( n ) 中,n m + 1 n m + 1 的系数总是 1 m + 1 1 m + 1 ,n m n m 的系数是 − 1 2 − 1 2 ,n m − 1 n m − 1 的系数是 m 12 m 12 ,n m − 2 n m − 2 的系数是 0 0 ,n m − 3 n m − 3 的系数是 − m ( m − 1 ) ( m − 2 ) 720 − m ( m − 1 ) ( m − 2 ) 720 ,n m − 4 n m − 4 的系数是 0 ⋯ ⋯ 0 ⋯ ⋯ 而 n m − k n m − k 的系数总是某个常数乘上 m k – – = m ! ( m − k ) ! m k _ = m ! ( m − k ) ! 。
递推公式
根据伯努利的发现,我们有
S m ( n ) = 1 m + 1 m ∑ k = 0 ( m + 1 k ) B k n m + 1 − k S m ( n ) = 1 m + 1 ∑ k = 0 m ( m + 1 k ) B k n m + 1 − k
其中 B n B n 为伯努利数,其由一个递归关系定义:
m ∑ k = 0 ( m + 1 k ) B k = [ m = 0 ] ∑ k = 0 m ( m + 1 k ) B k = [ m = 0 ]
便于计算的表示:
B 0 = 1 B m = − m − 1 ∑ k = 0 ( m + 1 k ) B k m + 1 , m > 0 B 0 = 1 B m = − ∑ k = 0 m − 1 ( m + 1 k ) B k m + 1 , m > 0
根据手算,不难得出前几个值:
n n
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
11 11
12 12
B n B n
1 1
− 1 2 − 1 2
1 6 1 6
0 0
− 1 30 − 1 30
0 0
1 42 1 42
0 0
− 1 30 − 1 30
0 0
5 66 5 66
0 0
− 691 2730 − 691 2730
证明:
首先令
^ S m ( n ) = 1 m + 1 m ∑ k = 0 ( m + 1 k ) B k n m + 1 − k S ^ m ( n ) = 1 m + 1 ∑ k = 0 m ( m + 1 k ) B k n m + 1 − k
那么现在我们就是要证明 S m ( n ) = ^ S m ( n ) S m ( n ) = S ^ m ( n ) ,考虑使用数学归纳法。
首先
S 0 ( n ) = n − 1 ∑ i = 0 i 0 = n ^ S 0 ( n ) = 1 1 ( 1 0 ) B 0 n 1 = n S 0 ( n ) = ∑ i = 0 n − 1 i 0 = n S ^ 0 ( n ) = 1 1 ( 1 0 ) B 0 n 1 = n
S m + 1 ( n ) + n m + 1 = n ∑ k = 0 k m + 1 = n − 1 ∑ k = 0 ( k + 1 ) m + 1 = n − 1 ∑ k = 0 m + 1 ∑ j = 0 ( m + 1 j ) k j = m + 1 ∑ j = 0 ( m + 1 j ) n − 1 ∑ k = 0 k j = m + 1 ∑ j = 0 ( m + 1 j ) S j ( 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 )
当 m ≥ 1 m ≥ 1 时,假设 ∀ i ∈ [ 0 , m ) ∀ i ∈ [ 0 , m ) 均有 S i ( n ) = ^ S i ( n ) S i ( n ) = S ^ i ( n ) ,将 S m + 1 ( n ) S m + 1 ( n ) 移项:
n m + 1 = m + 1 ∑ j = 0 ( m + 1 j ) S j ( n ) − S m + 1 ( n ) = m ∑ j = 0 ( m + 1 j ) S j ( n ) = m − 1 ∑ j = 0 ( m + 1 j ) S j ( n ) + ( m + 1 m ) S m ( n ) = m − 1 ∑ j = 0 ( m + 1 j ) ^ S j ( n ) + ( m + 1 ) S m ( 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 )
设
Δ = S m ( n ) − ^ S m ( n ) Δ = S m ( n ) − S ^ m ( n )
那么现在就是要证 Δ = 0 Δ = 0 。
n m + 1 = [ m − 1 ∑ j = 0 ( m + 1 j ) ^ S j ( n ) + ( m + 1 ) ^ S m ( n ) ] + ( m + 1 ) S m ( n ) − ( m + 1 ) ^ S m ( n ) = m ∑ j = 0 ( m + 1 j ) ^ S j ( n ) + ( m + 1 ) Δ 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 ) Δ
根据 ^ S m ( n ) S ^ m ( n ) 的定义将其展开,有
n m + 1 = m ∑ j = 0 ( m + 1 j ) 1 j + 1 j ∑ k = 0 ( j + 1 k ) B k n j + 1 − k + ( m + 1 ) Δ 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 ) Δ
将 k k 改为倒序枚举 并 利用 对称恒等式
( n m ) = ( n n − m ) , n ∈ N , k ∈ Z ( n m ) = ( n n − m ) , n ∈ N , k ∈ Z
n m + 1 = m ∑ j = 0 ( m + 1 j ) 1 j + 1 j ∑ k = 0 ( j + 1 j − k ) B j − k n k + 1 + ( m + 1 ) Δ = m ∑ j = 0 ( m + 1 j ) 1 j + 1 j ∑ k = 0 ( j + 1 k + 1 ) B j − k n k + 1 + ( m + 1 ) Δ 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 ) Δ
利用 吸收恒等式
( r k ) = r k ( r − 1 k − 1 ) , k ∈ Z , k ≠ 0 ( r k ) = r k ( r − 1 k − 1 ) , k ∈ Z , k ≠ 0
n m + 1 = m ∑ j = 0 ( m + 1 j ) 1 j + 1 j ∑ k = 0 j + 1 k + 1 ( j k ) B j − k n k + 1 + ( m + 1 ) Δ = m ∑ j = 0 ( m + 1 j ) j ∑ k = 0 n k + 1 k + 1 ( j k ) B j − k + ( m + 1 ) Δ = m ∑ k = 0 n k + 1 k + 1 m ∑ j = k ( m + 1 j ) ( j k ) B j − k + ( m + 1 ) Δ 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 ) Δ
利用 三项式版恒等式
( r m ) ( m k ) = ( r k ) ( r − k m − k ) ( r m ) ( m k ) = ( r k ) ( r − k m − k )
n m + 1 = m ∑ k = 0 n k + 1 k + 1 m ∑ j = k ( m + 1 k ) ( m − k + 1 j − k ) B j − k + ( m + 1 ) Δ = m ∑ k = 0 n k + 1 k + 1 ( m + 1 k ) m ∑ j = k ( m − k + 1 j − k ) B j − k + ( m + 1 ) Δ 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 ) Δ
将 j − k j − k 改为 j j
n m + 1 = m ∑ k = 0 n k + 1 k + 1 ( m + 1 k ) m − k ∑ j = 0 ( m − k + 1 j ) B j + ( m + 1 ) Δ 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 ) Δ
又根据伯努利数的递归定义
m ∑ k = 0 ( m + 1 k ) B k = [ m = 0 ] ∑ k = 0 m ( m + 1 k ) B k = [ m = 0 ]
n m + 1 = m ∑ k = 0 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 ) Δ 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 ) Δ
至此,我们推出了
( m + 1 ) Δ = 0 ∵ m + 1 ≠ 0 ∴ Δ = 0 ( m + 1 ) Δ = 0 ∵ m + 1 ≠ 0 ∴ Δ = 0
证毕。
当然,还有一种用 指数生成函数 的更简单的证明方法,就先不证了(
代码实现
显然这东西一般用在有模数的情况下。
下列代码计算的是 n ∑ k = 0 k m ∑ k = 0 n k m ,因此需要 n++;
。
时间复杂度为 O ( m 2 ) O ( m 2 ) 。
暴力计算的时间为 O ( n log m ) O ( n log m ) ,在 n n 巨大时伯努利数有巨大优势,参见 P6271 [湖北省队互测2014]一个人的数论 使用莫反 + 伯努利数或时间复杂度同级的拉格朗日插值。
#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 + 1 ; i++)
{
C[i][0 ] = C[i][i] = 1 ;
}
for (int i = 1 ; i <= N + 1 ; 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.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义