luogu P4721 模板 分治 FFT

2022-05-11 13:20:28 字數 732 閱讀 6714

題面傳送門

為什麼寫的是分治ntt啊,有哪位大佬會實數取模的fft教我一下。

首先觀察這個東西不是很好搞。因為後面要基於前面的轉移。

但是我們發現如果用分治就可以無視這個限制。

所以用cdq分治,轉移區間為\([l,r]\)中點\(mid\)就先把\(f\)的\([l,mid]\)和\(g\)的\([0,r-l]\)卷起來,然後轉移到後面即可。

時間複雜度\(o(nlog^2n)\),常數還是蠻小的。

先把序列長度補成\(2\)的冪次會好寫一點。

code:

#include#define g 3

#define mod 998244353

#define ll long long

inline ll mpow(ll x,int y=mod-2)

return ans;

}const ll invg=mpow(g);

using namespace std;

int n,m,k,x,y,z,tr[400039];

ll g[400039],f[400039],ans[400039],a[400039];

inline void make(int x)

inline void swap(ll &x,ll &y)

inline void ntt(ll *f,int n,int flag)

int main()

luoguP4721 模板 分治 FFT

luogu 給定長度為 n 1 的陣列 g 1 g 2 g n 1 求 f 0 f 1 f n 1 其中 f i sum if i j g j 邊界為 f 0 1 答案模 998244353 分治 ntt。跑900 ms 其實limit只要設到區間長度就可以了,其他的是用不到的。對前半部分也沒得影響...

P4721 模板 分治 FFT

雖然說是fft但是還是寫了一發ntt 笑 然後忘了idft之後要除個n懵逼了好久 以及遞迴的時候忘了邊界無限re 樸素演算法 分治fft 考慮到題目要求求這樣的乙個式子 f x sigma f g 我們可以按定義暴力,然後再鬆式卡常 不是 我們可以發現它長得像乙個卷積一樣,但是因為後面的f值會依賴與...

洛谷4721 模板 分治 FFT

點此看題面 大致題意 給定 g 求 f 滿足 f 0 1,f i sum if g j i 0 話說為什麼分治fft的板子要求寫的卻是分治ntt。考慮 cdq 分治,每次先處理左區間,然後求出左區間對右區間的貢獻 做範圍為區間長度的卷積 接著再遞迴處理右區間。方便起見可以把一開始給定的 n 變成 2...