伯努利数
伯努利数是一个这样的数列:{1,−12,16,0,−130,0,142,0,−130,0,…}
(所有大于2的奇数项都是0)
满足:
n∑k=0(n+1k)Bk=0(n>0)
换个方式写:
n∑k=0(nk)Bk=Bn(n≠1)
观察上面的式子, 我们可以将{Bi}的EGF和{1,1,1,…}的EGF乘起来, 得到:
B(x)ex=B(x)+xB(x)=xex−1
(左边加的x是特殊处理n≠1的限制)
所以我们就可以用多项式求逆在O(nlogn)的时间内求出B1…Bn了.
设Sm(n)=∑n−1i=0im, 那么有:
Sm(n)=1m+1m∑k=0(m+1k)Bknm+1−k
递推
由(i+1)k+1−ik+1=k∑j=0(k+1j)ij累加得:
(n+1)k+1−1=n∑i=1k∑j=0(k+1j)ij=k∑j=0(k+1j)n∑i=1ij
将n∑i=1ik拿出来:
n∑i=1ik=(n+1)k+1−1−∑k−1j=0(k+1j)∑ni=1ij(k+1k)=(n+1)k+1−1−∑k−1j=0(k+1j)∑ni=1ijk+1
直接递推即可。
差分
我们记一个序列的k次差分后的序列为Δk
任何k次多项式的点值经过k+1次差分后都会变成全为0的序列,即Δk均为0
我们对f(n)=nk进行差分,设ck为第0条对角线的第k项,那么有f(n)=k∑i=0ci(ni)。
所以:
n∑i=0f(i)=n∑i=0k∑j=0cj(ij)=k∑j=0cjn∑i=0(ij)=k∑j=0cj(n+1j+1)
关于最后那个组合数的推导∑ni=0(ij)=(n+1j+1),可以理解为:有j+1个球和n+1个盒子,枚举最后一个球放的位置i+1,剩下的球放置的方案就是(ij)。
拉格朗日插值
可以证明n∑i=0ik是一个k+1次多项式,因此我们可以用插值来做。
先求出x=0…k+1的点值,然后将n带入即可。
时间复杂度是O(klogk)。
简便实现:
设多项式为∑k+1i=0coefi(x)xi,根据拉格朗日插值的那个式子得到:
coefp+1(x)=coefp(x)×(x−p)(p−k)(x−p−1)(p+1)
直接将得到的系数乘点值即可。
如果要做到O(k),线性筛得到xk即可(瓶颈在于快速幂, 质数个数的级别是klogk的, 只对质数做快速幂, 时间复杂度就是O(k)的了)。
斯特林数
(nk)=nk––k!=k∑i=0[ki](−1)k−inik!k!(nk)=k∑i=0[ki](−1)k−inink=k!(nk)−k−1∑i=0[ki](−1)k−ini
那么
n∑i=0ik=n∑i=0(k!(ik)−k−1∑j=0[kj](−1)k−jij)=k!n∑i=0(ik)−n∑i=0k−1∑j=0[kj](−1)k−jij=k!(n+1k+1)−k−1∑j=0[kj](−1)k−jn∑i=0ij=(n+1)k+1–––––k+1−k−1∑j=0[kj](−1)k−jn∑i=0ij
至于1k+1,一定可以在(n+1)k+1–––––中除去。
所以直接O(k2)预处理出第一类斯特林数即可。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法