洛谷P4721 分治FFT

2021-09-27 08:18:27 字數 763 閱讀 9864

分治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值會依賴與...