分治fft
這個題一眼看上去就很像f=f
∗g
f = f*g
f=f∗
g,當自定義g[0
]=
0g[0] = 0
g[0]=0
的時候,題目中給出的f
ff與這個卷積就只有常數項不同,因此考慮計算這個卷積。由於f
ff的係數未知,因此不能直接卷積,如果逐項求,每次做一遍卷積那樣時間上承受不了。考慮分治,思路和cdq
cdqcd
q一樣,先遞迴計算低次項,再計算低次項對高次項的影響,再遞迴計算高次項。低次項對高次項的影響卷積即可。
void
cdq_ntt
(ll *f, ll *g,
int l,
int r)
int mid =
(l + r)
>>1;
cdq_ntt
(f, g, l, mid)
; poly.
multiply
(f + l, mid - l +
1, g, r - l +
1, ans)
;for
(int i = mid +
1; i <= r;
++i)
(f[i]
+= ans[i - l])%
= mod;
cdq_ntt
(f, g, mid +
1, r)
;}
洛谷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,...
P4721 模板 分治 FFT
雖然說是fft但是還是寫了一發ntt 笑 然後忘了idft之後要除個n懵逼了好久 以及遞迴的時候忘了邊界無限re 樸素演算法 分治fft 考慮到題目要求求這樣的乙個式子 f x sigma f g 我們可以按定義暴力,然後再鬆式卡常 不是 我們可以發現它長得像乙個卷積一樣,但是因為後面的f值會依賴與...