分治FFT學習筆記

2022-05-11 15:34:26 字數 1246 閱讀 6677

我們先來看一道例題:

給定序列\(\\}\),已知\(f_0=1\) ,\(f_n=\sum_^ f_\times g_i\),求序列\(\\),對\(998244353\)取模

考慮最樸素的做法,\(o(n^2)\),在\(n\)比較小的情況下是可以的

考慮\(f_i\)的計算顯然可以化成卷積的形式,但\(f_i\)的計算依賴於之前的\(f\),直接\(ntt\),退化成\(o(n^2 \log n)\)

那麼在\(n\)比較大的情況下,我們要怎麼來做這個東西呢?

在引入,我們得到乙個\(o(n^2 \log n)\)的做法,接下來,考慮如何優化這個做法

我們考慮分治,現在我們要計算\([l,r]\)的\(f\),把它分成\([l,mid]\)和\([mid+1,r]\),現在假設我們已經算出了\([l,mid]\)

考慮計算\([l,mid]\)的\(f\)對\([mid+1,r]\)的\(f\)的貢獻,對於乙個\(mid< x \le r\),設\(w[x]\)為\([l,mid]\)對\(x\)的貢獻

\[w[x]=\sum_^ f_i \times g_\\

w[x]=\sum_^ f_i \times g_\\

\]我們可以直接補到\(x\),因為大於\(mid\)的部分\(f\)為\(0\),可以發現,\(w[x]\)的計算顯然可以寫成卷積的形式

在這裡,我們令\(a[i]=f_\),令\(b[i]=g_\),那麼,\(w[x]\)可以寫成這樣

\[w[x]=\sum_^ a[i]\times b[x-l-1-i]

\]則我們可以一次\(ntt\)直接算出這一部分的貢獻,然後繼續分治即可,時間複雜度\(o(n \log ^2 n)\)

#include#define int long long

using namespace std;

const int mod=998244353;

const int n=2e5+11;

int n,g[n],f[n],a[n],b[n],p[n];

int read()

while(isdigit(ch))

return x*f;

}int qpow(int x,int y)return re;

}void ntt(int *a,int flag,int len)}}

}void transform(int len)

signed main()

分治FFT學習筆記

在 o n log 2 n 的時間內做諸如 f n sum f ig 或是 f n sum f if 或是 f sum s sum t sum i f f 等 我 卷 我 自 己 的式子。如果你覺得這東西多項式求逆也可以做,那麼請你認真看一下第三個式子 用cdq分治的思想 先遞迴做出左邊,考慮左邊對...

模板 分治FFT

luogu4721一道模板題 前置知識 fft ntt cdq cdqcd q分治 雖然本人覺得和cdq cdqcd q沒啥關係,應該只用了分治思想 用來解決這樣的式子 f i j 1i f i j g j f i sum i f i j times g j f i j 1i f i j g j 可...

FFT學習筆記

fft可用於解決一些卷積問題。一般問題形式如下 c a b c i ij 0a i b i j 若把a,b看成兩個次數為n多項式 a x ni 0 a i xi,b x ni 0b i x i 原問題等於兩個多項式相乘,c的次數等於2n 1 乙個次數界為n的多項式a的點值表達為n個點值對所組成的集合...