分治FFT學習筆記

2022-05-08 01:09:08 字數 1481 閱讀 5928

在\(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,用多項式求逆也可以實現。

現在\(g\)也被\(f\)替換了,考慮仍然用上面的做法,但你會發現:你掛了。

為什麼會掛呢?

上面的統計貢獻的過程是這樣的:分治\([l,r]\)時,先做出\([l,mid]\)的\(f\),然後把\([l,mid]\)的\(f\)和\([1,r-l+1]\)的\(g\)卷在一起,把貢獻算到\([mid+1,r]\)上面去。

但是現在發現乙個漏洞:如果\(g\)替換成了\(f\),那麼\([1,r-l+1]\)的\(f\)可能還沒有被完全算出來。

什麼時候會發生這種情況呢?考慮分治結構其實和線段樹結構相同,滿足左邊的大小\(\ge\)右邊的大小,所以只有在最左邊的那個區間可能會發生這種事,也就是\(l=1\)時。

那怎麼辦?怎麼提前算出右邊?

我也不知道

既然不能提前算出來,那就不算,只算出\(f\)在\([l,mid]\)的值對右邊的貢獻之後直接往右邊遞迴。

顯然,乙個點不能對自己產生貢獻,所以遞迴到乙個點的時候肯定是對的。

而兩個點時可以算出\(l\)對\(r\)的貢獻,也是對的。

以此類推,它就是對的。

(完全嚴謹的證明我也不會啊qwq)

注意:當\(l\ne 1\)時把\([l,mid]\)和\([1,r-l+1]\)卷起來時相當於欽定乙個指標在\([l,mid]\),而另乙個在\([1,r-l+1]\),但實際上他們有可能會交換位置,所以要乘2。

update:我都寫了些啥……其實就是把兩個卷起來的時候有兩個指標,在右邊的那個指標位置統計貢獻,所以直接遞迴右邊完全莫得問題。當卷積並不是二次方而是三次方、四次方的時候也照樣可以在最右邊的那個位置統計貢獻。

這個式子真是醜呢……

然而直接用式子二的方法就可以了,方法並沒有太大不同,除了……

注意:當\([l\ne 1]\)時¥%……&@&¥%¥,也相當於欽定了指標的位置,所以還要交換來一遍。

這麼說可能比較難理解,考慮這麼乙個式子:

\[f1_n=\sum_i f1_if2_\\

f2_n=\sum_i f2_if1_

\]這時你不能簡單地把\(f1[l,mid]\)和\(f2[1,r-l+1]\)卷起來,還要把\(f2[l,mid]\)和\(f1[1,r-l+1]\)卷起來,這才能做到不重不漏。

**現在不在我電腦上,我又那麼懶,所以——

咕咕咕……

(建議去 食用**/kel)

分治FFT學習筆記

我們先來看一道例題 給定序列 已知 f 0 1 f n sum f times g i 求序列 對 998244353 取模 考慮最樸素的做法,o n 2 在 n 比較小的情況下是可以的 考慮 f i 的計算顯然可以化成卷積的形式,但 f i 的計算依賴於之前的 f 直接 ntt 退化成 o n 2...

模板 分治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個點值對所組成的集合...