P4721 模板 分治 FFT

2022-05-01 21:15:14 字數 790 閱讀 1173

雖然說是fft但是還是寫了一發ntt(笑)

然後忘了idft之後要除個n懵逼了好久

以及遞迴的時候忘了邊界無限re

樸素演算法

分治fft

考慮到題目要求求這樣的乙個式子

\[f_x=\sigma_^f_g_

\]我們可以按定義暴力,然後再鬆式卡常(不是)

我們可以發現它長得像乙個卷積一樣,但是因為後面的f值會依賴與前面的f值,所以沒法一遍fft直接求出結果,而對每個f都跑一遍fft太慢了,我們使用分治優化這個過程就很優秀了,複雜度是\(o(n\log^2 n)\)

分治優化

我們能夠想到cdq分治的思想,在統計乙個區間時,確保對這個區間有影響的操作產生的貢獻已經全被統計,就是先統計[l,mid]區間對[mid+1,r]區間的貢獻

然後發現對於每個\(f_x\),它對後面的\(f_i\)產生的貢獻是\(\sigma_^ f_g_\)

然後分治就好

#include #include #include #define int long long

using namespace std;

const int mod = 998244353,g=3,invg=332748118;

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

int pow(int a,int b)

return ans;

}void fft(int *a,int opt,int n)

signed main()

題解 P4721 模板 分治 FFT

題目鏈結 題目大意 給定 g f 0 1 求 f 其中 f i sum f g j 對 998244353 取模 ntt 分治 分析 有兩種做法 首先可以多項式求逆 現在還不會 然後可以用分治加上ntt fft 優化卷積的方法 首先我們注意到,對於乙個位置 i 它依賴於 0,i 1 處 f 的值,如...

洛谷P4721 模板 分治 FFT

題目大意 給定長度為 n 1 的陣列 g 求 f 要求 f i sum if g j f 0 1 題解 直接求複雜度是 o n 2 明顯不可以通過此題 分治 fft 可以用 cdq 分治,先求出 f 可以發現這部分對區間的 f 的貢獻是 f g 卷出來加到對應位置就行了,複雜度 o n log 2 ...

洛谷 P4721 模板 分治 FFT 解題報告

也可用多項式求逆解決。給定長度為 n 1 的陣列 g 1 g 2 dots,g n 1 求 f 0 f 1 dots,f n 1 其中 f i sum if i j g j 邊界為 f 0 1 答案模 998244353 第一行乙個正整數 n 第二行共 n 1 個非負整數 g 1 g 2 dots,...