题目大意:
设S(n,m)为第二类斯特林数,Fi表示斐波那契数列第i项。
给定n,R,K,求n∑i=1(R∑m=1Fm)!i!i∑l=0R∑t=1Ft∑j=0S(k,i−l)l!S(i,R∑w=1Fw−j)j!mod1000000007 的值,其中n,R≤1018,k≤2∗105
题解:
首先,这道题需要用到3个前置知识:
1. n∑i=1Fi=Fn+2−1
使用数学归纳法即可证明。
2. mn=m∑i=1S(n,i)(mi)i!
考虑把n个不同的球放入m个不同的盒子里且允许有空盒的方案数。
显然,每个球都有m种选择方法,答案是mn。
另一方面,考虑n个球恰好占用了i个盒子的方案数,不难得出刚好是S(n,i)(mi)i!,再对i求和即为右式。
3. 拉格朗日插值:给定平面上n+1个点(x0,y0),(x1,y1),⋯,(xn,yn),其中xi两两不等,
则存在唯一一个次数不超过n的多项式经过这些点,且这个多项式刚好是:f(x)=n∑i=0yi∏j≠ix−xjxi−xj
显然f(x)满足条件:次数不超过n且f(xi)=yi。唯一性:假设这个多项式为a0+a1x+⋯+anxn,
则可以根据点值列出关于ai的线性方程组,其系数行列式刚好为范德蒙德行列式,根据xi不等的条件可得
系数行列式非零,从而方程组的解存在且唯一,因此上述构造的f(x)就是唯一的。
================================分割线================================
回到原题,设u=R∑m=1Fi=FR+2−1,其可以通过矩阵快速幂在Θ(logR)时间求出,则有:
ANS=n∑i=1u!i!i∑l=0u∑j=0S(k,i−l)l!S(i,u−j)j!
=n∑i=1u∑j=0S(i,u−j)u!j!i∑l=0S(k,i−l)i!l!
=n∑i=1u∑j=0S(i,j)u!(u−j)!i∑l=0S(k,l)i!(i−l)!
=n∑i=1u∑j=0S(i,j)(uj)j!i∑l=0S(k,l)(il)l!
=n∑i=1uiik
u=1的情况
此时答案变为n∑i=1ik,这是一个经典的拉格朗日插值问题,可以证明该式可表示为关于n的k+1次多项式。
点击展开证明
考虑对k做第二数学归纳法:当k=0时,有n∑i=1ik=n∑i=11=n,成立。
如果该结论对任意的k<m成立,那么k=m时,注意到:nk+1=n∑i=1(ik+1−(i−1)k+1)
=n∑i=1(ik+1−k+1∑j=0(k+1j)ij(−1)k+1−j)
=n∑i=1((k+1)ik−k−1∑j=0(k+1j)ij(−1)k+1−j)
=(k+1)n∑i=1ik−k−1∑j=0(−1)k+1−j(k+1j)n∑i=1ij
整理得:n∑i=1ik=nk+1k+1+k−1∑j=0(−1)k+1−jk+1(k+1j)n∑i=1ij
根据归纳假设,等式右侧为k个关于n的j+1次多项式的线性组合,求和后次数不超过k,
因此n∑i=1ik可以表示为关于n的k+1次多项式,得证。
===============================证明结束===============================
所以只需知道n在k+2个点处的取值,即可通过拉格朗日插值求出答案,这里我们取0,1,⋯,k+1。
首先预处理出点值ym=m∑i=1ik,(m=0,1,⋯,k+1),注意朴素的快速幂加前缀和的时间复杂度为
Θ(klogk),因此需要借助线性筛,筛出数论函数f(n)=nk,此时只需在素数点处使用快速幂求值,
因此根据素数定理,时间复杂度可以降为Θ(klnk⋅logk)=Θ(k)。
根据拉格朗日插值:ANS=k+1∑i=0yi∏0≤j≤k+1,j≠in−ji−j=k+1∑i=0yi(−1)k+1−ini–(n−k−1)¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯k−i+1i!(k+1−i)!
其中记号x¯¯¯n和xn––表示上升幂和下降幂,其定义如下:x¯¯¯n=n−1∏i=0(x+i),xn––=n−1∏i=0(x−i)
而上述出现的上升幂及下降幂均可在Θ(k)时间内预处理出来,因此最终时间复杂度为Θ(k)。
u≠1的情况
首先观察一下k比较小时这个式子的形式(可以通过等比数列求和、错位相减等技术求得):n∑i=1uii0=un+1−uu−1=un⋅uu−1−uu−1
n∑i=1uii1=un(uu−1n−u(u−1)2)+u(u−1)2
n∑i=1uii2=un(uu−1n2−2u(u−1)2n+u2+u(u−1)3)−u2+u(u−1)3
我们发现答案的形式大概是un乘上一个关于n的k次多项式,最后再加上一个常数,而这个常数似乎刚好与前面
那个多项式的常数项相反!因此我们大胆猜想:
存在一个关于n的k次多项式pk(n),使得对任意自然数n都有如下关系式成立:n∑i=1uiik=unpk(n)−pk(0)
当然我们也可以严格地证明这个结论。
点击展开证明
考虑对k使用第二数学归纳法:当k=0时,上面已经验证过了,结论成立。
如果该结论对任意的k<m成立,那么k=m时,注意到:(u−1)n∑i=1uiik=n∑i=1ui+1ik−n∑i=1uiik
=n+1∑i=2ui(i−1)k−n∑i=1uiik
=un+1nk+n∑i=1ui((i−1)k−ik)
=un+1nk+n∑i=1ui(k∑j=0(kj)ij(−1)k−j−ik)
=un+1nk+n∑i=1uik−1∑j=0(kj)ij(−1)k−j
=un+1nk+k−1∑j=0(−1)k−j(kj)n∑i=1uiij
根据归纳假设,对于j=0,⋯,k−1,存在j次多项式pj(n)使得n∑i=1uiij=unpj(n)−pj(0),
因此整理得:n∑i=1uiik=un+1nku−1+1u−1k−1∑j=0(−1)k−j(kj)(unpj(n)−pj(0))
=un(uu−1nk+k−1∑j=0(−1)k−ju−1(kj)pj(n))−k−1∑j=0(−1)k−ju−1(kj)pj(0)
令pk(n)=uu−1nk+k−1∑j=0(−1)k−ju−1(kj)pj(n)
则容易验证有n∑i=1uiik=unpk(n)−pk(0),结论成立。
===============================证明结束===============================
回到原问题,现在只需考虑求出pk(n)和pk(0),根据拉格朗日插值,如果我们求出了pk(0),pk(1),⋯,pk(k)
,我们便可在Θ(k)时间求出pk(n)。而这里想要求出pk的系数似乎是困难的,因此我们考虑pk(i)的关系,然后
解方程求出这些值,注意到对m=1,2,⋯,k+1,有:umpk(m)−pk(0)=m∑i=1uiik=ummk+m−1∑i=1uiik
=ummk+um−1pk(m−1)−pk(0)
整理可得如下递推关系:pk(m)=mk+1upk(m−1)⋯⋯(∗)
至此我们得到了一个包含k+2个未知数pk(0),pk(1),⋯,pk(k+1)和k+1个方程的方程组,我们还需要
一个方程才能求解。但是别忘了,pk是k次的,拉格朗日插值告诉我们pk(k+1)可由pk(0),pk(1),⋯,pk(k)
线性表示!具体来说,有:pk(k+1)=k∑i=0pk(i)∏0≤j≤k,j≠ik+1−ji−j
=k∑i=0pk(i)(k+1)!(−1)k−i(k+1−i)i!(k−i)!=k∑i=0(−1)k−i(k+1i)pk(i)
由此我们得到了最后一个方程,写得再简洁一些就是:k+1∑i=0(−1)k−i(k+1i)pk(i)=0⋯⋯(∗∗)
接着只需求解这个方程组,注意到每个pk(i)都可以容易地根据(∗)式表示成xipk(0)+yi的形式,其中x0=1,y0=0
xi=xi−1u,yi=yi−1u+ik,i=1,2,⋯,k+1
将结果代入(∗∗)式即可得到只含pk(0)的一次方程,解出pk(0)后自然可以得到其它的pk(i)。
最后,应用拉格朗日插值求出pk(n)即可得到答案,总时间复杂度为Θ(k+logn+logR)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现