lmt

[P4721] 分治 FFT

断了今生、忘了曾经 提交于 2020-03-07 06:51:48
「题意」给定 \(g[0]=1\) , \(g[1~n-1]\) 求序列 \(f[i]=\sum_{j=1}^i f[i-j]*g[j]\ , i\in[1,n-1],f[0]=1\) 。 「分析」分治处理区间[l,r],先递归求出[l,mid],在统计[l,mid]对[mid+1,r]的贡献,可以发现 \[f[x]+=\sum_{i=l}^{mid}f[i]*g[x-i]\ , x\in[mid+1,r]\] 拿卷积算,令 \(A[0,mid-l]\) = \(f[l,mid]\) , \(B[l,r-l]\) = \(g[1,r-l]\) , \(B[0]=0\) ,设 \(C[i]\) = \(A[i]*B[i-j]\) , 那么 \[f[x]+=\sum f[i]*g[x-1]=\sum A[i-l]*B[x-i]=C[x-l]\] 套上ntt 「代码」 #include <bits/stdc++.h> using namespace std; const int N=4e5+10; const int P=998244353,G=3; int n,lmt,l,rev[N]; int g[N],f[N],A[N],B[N]; int qpow(int x,int y) { int c=1; for(; y; y>>=1,x=1LL*x*x%P) if(y&1) c=1LL