• BZOJ4555求和(cdq分治+NTT)


    题意:

    输出f(n)对998244353(7 × 17 × 223 + 1)取模的结果。1 ≤ n ≤ 100000

    其中S(i,j)是第二类Stirling数,即有i个球,丢到j个盒子中,要求盒子不为空的方案总数

    S(i,j)=S(i-1,j-1)+j*S(i-1,j) (前面一项表示第i个球单独放到一个盒子中,后面一项表示放到前面j个盒子中的某一个)

    分析:

    首先这个n不是丧心病狂的大,所以感觉可以求i=1时的结果,i=2时的结果,i=3时的结果……,于是可以不看第一个Σ

    我们考虑后面的这项

    这个表示有n个球,要丢到i个盒子中,这些盒子是有序的,并且球在盒子中有两种状态

     换个方式枚举,枚举最后一个盒子中球的个数,那么有

    右边这个有卷积的感觉了,再来弄一下,将组合公式带进去

    令G(n)=g(n)/n!

    那么有

    这个inv(n-i)表示模意义下(n-i)!的逆元,这个预处理很简单

    问题是这个并不是很简单的卷积,因为卷积是A(n)=ΣB(i)*C(n-i),但这里A=C

     这里可以采取cdq分治的思想

     我们要求G(l..r)

    第一步:求G(l..mid)

    第二步:求G(l..mid)对G(mid+1,r)的影响

    第三步:求G(mid+1,r)

    具体说下第二步

    这时候G(l,mid)都已经确定了,它们对G(mid+1)的贡献是容易发现就是G(0,mid-l)和inv(0,r-l)的卷积

    所以就是cdq分治过程中进行FFT

    但因为这题数字很大,所以用FFT会出现精度上的问题

    而且这题模数那么特殊,所以直接上NTT……

    T(n)=T(n/2)+O(nlogn)

    这个复杂度应该介于O(nlogn)和O(nlog^2n)之间吧……

  • 相关阅读:
    微信下载远程图片的公用方法
    微信接口调用
    微信
    post方法
    asp.net pagebase获取缓存的方法
    sql查询最大id
    Controller里写自己需要的Action,参数的名字必须和路由设置的参数名一致

    递归调用
    队列及其应用
  • 原文地址:https://www.cnblogs.com/wmrv587/p/7110310.html
Copyright © 2020-2023  润新知