自然数幂和多项式

听说一个人的数论要用伯努利数处理自然数幂和,然而我之前只会插值,吓得跑去学了一下自然数幂和 .

附录 — 前置知识

插值相关:看我的博客 link(旧文慎入) .


第二类斯特林数相关:

定义:第二类斯特林数 {nk} 表示 n 个有标号小球放入 k 个无标号集合,每个集合都非空的方案数 .

然后根据组合意义(这个证明和二项式系数那个差不多),可以得到递推式:

{nk}=k{n1k}+{n1k1}

然后这个可以 O(n2) 递推 .

普通幂转下降幂(后面会说)

nk=i=0k{ki}ni_

套二项式反演(你也可以看成套了一个容斥),然后变成

{nm}=1m!i=0m(1)i(mi)(mi)n

是不是卷积的形式 .

于是可以 O(nlogn) 卷积求一行 .


伯努利数相关:

伯努利数 {B} 是如下定义的有理数序列:

i=0n(n+1i)Bi=0

其中 B0=1 .

然后可以根据定义 O(n2) 求 .

我们考虑整出它的 EGF .

显然式子是不是可以改成

i=0n(n+1i)Bi=[n=0]

做一些平凡的操作:

i=0n(n+1i)Bi=[n=0]i=0n+1(n+1i)=Bn+1+[n=0]i=0n(ni)=Bn+[n=1]Bnn!+[n=1]=i=0n1(ni)!Bii!

这就有点 EGF 的样子了,改成 EGF 的形式:

B(x)+x=B(x)exp(x)

然后显然就有

B(n)=xexp(x)1

于是可以一次求逆做到 O(nlogn) 求一行 求前 n 项 .


自然数幂和

(题目链接:CF622F

Sk(n)=i=0nik

做法

插值

差分一次变成 nk,显然是 k 次的 .

然而众所周知差分一次次数减一,于是 Skk+1 次的 .

暴力算出前 k 个点值然后插值即可,复杂度取决于你怎么插值 .

upd. O(1) 固定指数快速幂大家是不是都会啊,前面说的是求系数的复杂度,如果求单点当然是插值最快 .

How to solve it?

显然 f(n)=nk 是完全积性函数 .

素数处暴力算,别的地方线性筛即可,代码特别好写 .

预处理 O(n),询问 O(1) .

系数咋求:

  1. 快速插值 O(nlog2n) .
  2. 下降幂多项式形式(斯特林数相关)O(nlogn) .
  3. 普通多项式形式(伯努利数相关)O(nlogn) .

下面说后面两个 .

第二类斯特林数

普通幂转下降幂:

nk=i=0k{ki}ni_

证明:考虑组合意义即可,LHS 是子集数,RHS 相当于枚举非空子集数然后算贡献 .

根据小学生就会的裂项,我们可以算出下降幂和:

Sk_(n)=i=0kni_=1k+1i=0n((i+1)k+1_ik+1_)=1k+1(n+1)k+1_

然后把两个式子结合到一起,就变成

Sk(n)=i=0k1i+1{ki}(n+1)k+1_

第二类斯特林数求一行可以 O(nlogn) .

这个方法如果 n 是合数,那么下降幂和 1i+1 显然可以约分(根据抽屉原理),然后就不需要任何逆元操作了 .

伯努利数

!!!!!! 如果你不知道 EGF 是啥,有一个 归纳做法 .

一篇奥妙重重的博客 link,看起来很牛逼,然而我并不懂 .

以下可能比较清晰 .


为了后面写着方便,把 n 自减,即定义 Sk(n)=i=0n1ik .

众所周知伯努利数的 EGF 为

B(n)=xexp(x)1

然后我们拿出 Sk 的 EGF:

k0xkk!Sk(n)=k0xkk!i=1n1ik=i=1n1k0ikxkk!=i=1n1exp(xi)=exp(nx)1exp(x)1

然后发现这个 EGF 和伯努利数 EGF 挺像,于是改一下形式:

exp(nx)1exp(x)1=xexp(x1)exp(nx)1x

然后我们就可以拆成一个伯努利数 EGF 乘一个指数的 EGF .

提取系数:

[xkk!]k0xkk!Sk(n)=[xkk!]((k0xkk!Bk)(k0xkk!nk+1))=k!i=0kBii!nk+1i(k+1i)!=1k+1i=0k(k+1i)Bink+1i=1k+1i=1k+1(k+1i)Bk+1ini

Sk(n)=1k+1i=1k+1(k+1i)Bk+1ini

如果转成一般用的 Sk,柿子的形式可以看 here .

posted @   yspm  阅读(138)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
😅​
点击右上角即可分享
微信分享提示