2019.10.02模拟赛T3 最优解

题目大意:

  设S(n,m)为第二类斯特林数,Fi表示斐波那契数列第i项。

  给定n,R,K,求i=1n(m=1RFm)!i!l=0ij=0t=1RFtS(k,il)l!S(i,w=1RFwj)j!mod1000000007  值,其中n,R1018k2105

题解:

  首先,这道题需要用到3个前置知识:

    1. i=1nFi=Fn+21

    使用数学归纳法即可证明。

    2. mn=i=1mS(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)=i=0nyijixxjxixj

    显然f(x)满足条件:次数不超过nf(xi)=yi唯一性:假设这个多项式为a0+a1x++anxn

    则可以根据点值列出关于ai的线性方程组,其系数行列式刚好为范德蒙德行列式,根据xi不等的条件可得

    系数行列式非零,从而方程组的解存在且唯一,因此上述构造的f(x)就是唯一的。

 

================================分割线================================

  回到原题,设u=m=1RFi=FR+21,其可以通过矩阵快速幂在Θ(logR)时间求出,则有:

ANS=i=1nu!i!l=0ij=0uS(k,il)l!S(i,uj)j!

=i=1nj=0uS(i,uj)u!j!l=0iS(k,il)i!l!

=i=1nj=0uS(i,j)u!(uj)!l=0iS(k,l)i!(il)!

=i=1nj=0uS(i,j)(uj)j!l=0iS(k,l)(il)l!

=i=1nuiik

u=1的情况

  此时答案变为i=1nik,这是一个经典的拉格朗日插值问题,可以证明该式可表示为关于nk+1次多项式。

  点击展开证明

    考虑对k做第二数学归纳法:当k=0时,有i=1nik=i=1n1=n,成立。

    如果该结论对任意的k<m成立,那么k=m时,注意到:nk+1=i=1n(ik+1(i1)k+1)

=i=1n(ik+1j=0k+1(k+1j)ij(1)k+1j)

=i=1n((k+1)ikj=0k1(k+1j)ij(1)k+1j)

=(k+1)i=1nikj=0k1(1)k+1j(k+1j)i=1nij

    整理得:i=1nik=nk+1k+1+j=0k1(1)k+1jk+1(k+1j)i=1nij

    根据归纳假设,等式右侧为k个关于nj+1次多项式的线性组合,求和后次数不超过k

    因此i=1nik可以表示为关于nk+1次多项式,得证。

===============================证明结束===============================

  所以只需知道nk+2个点处的取值,即可通过拉格朗日插值求出答案,这里我们取0,1,,k+1

  首先预处理出点值ym=i=1mik,(m=0,1,,k+1),注意朴素的快速幂加前缀和的时间复杂度为

  Θ(klogk),因此需要借助线性筛,筛出数论函数f(n)=nk,此时只需在素数点处使用快速幂求值,

  因此根据素数定理,时间复杂度可以降为Θ(klnklogk)=Θ(k)

  根据拉格朗日插值:ANS=i=0k+1yi0jk+1,jinjij=i=0k+1yi(1)k+1ini_(nk1)ki+1¯i!(k+1i)!

  其中记号xn¯xn_表示上升幂和下降幂,其定义如下:xn¯=i=0n1(x+i),xn_=i=0n1(xi)

  而上述出现的上升幂及下降幂均可在Θ(k)时间内预处理出来,因此最终时间复杂度为Θ(k)

 

u1的情况

  首先观察一下k比较小时这个式子的形式(可以通过等比数列求和、错位相减等技术求得):i=1nuii0=un+1uu1=unuu1uu1

i=1nuii1=un(uu1nu(u1)2)+u(u1)2

i=1nuii2=un(uu1n22u(u1)2n+u2+u(u1)3)u2+u(u1)3

  我们发现答案的形式大概是un乘上一个关于nk次多项式,最后再加上一个常数,而这个常数似乎刚好与前面

  那个多项式的常数项相反!因此我们大胆猜想:

  存在一个关于nk次多项式pk(n),使得对任意自然数n都有如下关系式成立:i=1nuiik=unpk(n)pk(0)

  当然我们也可以严格地证明这个结论。

  点击展开证明

    考虑对k使用第二数学归纳法:当k=0时,上面已经验证过了,结论成立。

    如果该结论对任意的k<m成立,那么k=m时,注意到:(u1)i=1nuiik=i=1nui+1iki=1nuiik

=i=2n+1ui(i1)ki=1nuiik

=un+1nk+i=1nui((i1)kik)

=un+1nk+i=1nui(j=0k(kj)ij(1)kjik)

=un+1nk+i=1nuij=0k1(kj)ij(1)kj

=un+1nk+j=0k1(1)kj(kj)i=1nuiij

    根据归纳假设,对于j=0,,k1,存在j次多项式pj(n)使得i=1nuiij=unpj(n)pj(0)

    因此整理得:i=1nuiik=un+1nku1+1u1j=0k1(1)kj(kj)(unpj(n)pj(0))

=un(uu1nk+j=0k1(1)kju1(kj)pj(n))j=0k1(1)kju1(kj)pj(0)

    令pk(n)=uu1nk+j=0k1(1)kju1(kj)pj(n)

    则容易验证有i=1nuiik=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)=i=1muiik=ummk+i=1m1uiik

=ummk+um1pk(m1)pk(0)

  整理可得如下递推关系:pk(m)=mk+1upk(m1)()

  至此我们得到了一个包含k+2个未知数pk(0),pk(1),,pk(k+1)k+1个方程的方程组,我们还需要

  一个方程才能求解。但是别忘了,pkk次的,拉格朗日插值告诉我们pk(k+1)可由pk(0),pk(1),,pk(k)

  线性表示!具体来说,有:pk(k+1)=i=0kpk(i)0jk,jik+1jij

=i=0kpk(i)(k+1)!(1)ki(k+1i)i!(ki)!=i=0k(1)ki(k+1i)pk(i)

  由此我们得到了最后一个方程,写得再简洁一些就是:i=0k+1(1)ki(k+1i)pk(i)=0()

  接着只需求解这个方程组,注意到每个pk(i)都可以容易地根据()式表示成xipk(0)+yi的形式,其中x0=1,y0=0

xi=xi1u,yi=yi1u+ik,i=1,2,,k+1

  将结果代入()式即可得到只含pk(0)的一次方程,解出pk(0)后自然可以得到其它的pk(i)

  最后,应用拉格朗日插值求出pk(n)即可得到答案,总时间复杂度为Θ(k+logn+logR)

posted @   ldysy2102  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示