1. 程式人生 > >BZOJ4555求和(cdq分治+NTT)

BZOJ4555求和(cdq分治+NTT)

width 枚舉 個數 .com 不為 影響 問題 .cn 特殊

題意:

技術分享

輸出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)之間吧……

BZOJ4555求和(cdq分治+NTT)