o_o 当前时间是:

4:02:18 AM

 

P4948 数列求和

传送门

description

给定 n,a,k,求 i=1naiik

  • n1018

  • k2103

solution

k 很小,使用第二类斯特林数处理 ik 得:

  • i=1naij=0{kj}(ij)j!

调换求和顺序得:

  • j=0min(n,k)j!{kj}i=min(1,j)nai(ij)

左边的可以枚举,主要考虑如何计算右边。把 k=0 特判掉,答案变成 i 取下界 j 的答案再 1

fj,n=i=jnai(ij)

根据组合数递推式,有:

  • fj,n=i=jnai((i1j)+(i1j1))=i=jnai(i1j)+i=jnai(i1j1)=afj,n1+afj1,n1

Fn(x){fj,n}j=0+ 的生成函数,则有 Fn(x)=a(x+1)Fn1(x)+1。(注意最后这个 +1,是常数项需要特殊处理的,可以把 fi,j 打表出来就会发现这一点)

于是可以多项式矩阵快速幂求出 Fn(x)(modxk+1) 了。问题是模数是 1e9+7,O(klogklogn) 在矩阵和任意模数的巨大常数下会很慢,而且代码太复杂。

解决办法是用朴素的多项式乘法代替 NTT,虽然时间复杂度变为 O(k2logn),但是常数小了,也好写。

开 O2 勉强卡过去。

提交记录

当然,也可以对生成函数进行进一步推导,发现需要多项式快速幂 + 多项式求逆。朴素做多项式乘法的话求逆和 lnexp 都是 O(k2) 的,所以可以做到 O(k2) 的时间复杂度。

_ANIG_ 实现的一份代码的提交记录

posted @   zzafanti  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
浏览器标题切换
浏览器标题切换end
点击右上角即可分享
微信分享提示