洛谷P4721 模板 分治 FFT

2022-05-23 22:12:07 字數 1233 閱讀 5072

題目大意:給定長度為$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^2n)​$

卡點:

c++ code:

#include #include #include namespace std 

inline istream& operator >> (int &x)

#undef m

} cin;

struct ostream

for (w = 1; w <= x; w *= 10);

for (w /= 10; w; w /= 10) *++ch = (x / w) ^ 48, x %= w;

return *this;

} inline ostream& operator << (const char x)

inline ~ostream()

#undef m

} cout;

}#define maxn 131072 | 3

const int mod = 998244353, g = 3;

namespace math

inline int inv(int x)

}int n;

int f[maxn], g[maxn];

namespace poly

inline void clear(register int *l, const int *r)

inline void init(const int n)

inline void ntt(int *a, const int op = 1)

}} if (!op) for (int i = 0; i < lim; i++) a[i] = static_cast(a[i]) * ilim % mod;

} int a[n], b[n];

void cdq_ntt(const int l, const int r)

#undef n

}int main()

P4721 模板 分治 FFT

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

洛谷 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 這個題一眼看上去就很像f f g f f g f f g,當自定義g 0 0g 0 0 g 0 0 的時候,題目中給出的f ff與這個卷積就只有常數項不同,因此考慮計算這個卷積。由於f ff的係數未知,因此不能直接卷積,如果逐項求,每次做一遍卷積那樣時間上承受不了。考慮分治,思路和cdq...