點此看題面
大致題意:給定\(g_\),求\(f_\),滿足\(f_0=1,f_i=\sum_^if_g_j(i>0)\)。
話說為什麼分治fft的板子要求寫的卻是分治ntt。
考慮\(cdq\)分治,每次先處理左區間,然後求出左區間對右區間的貢獻(做範圍為區間長度的卷積),接著再遞迴處理右區間。
方便起見可以把一開始給定的\(n\)變成\(2\)的冪。
其實也挺簡單的,主要是當個模板題來寫一寫。。。
#include#define tp template#define ts template#define reg register
#define ri reg int
#define con const
#define ci con int&
#define i inline
#define w while
#define n 100000
#define x 998244353
using namespace std;
int n,f[2*n+5],g[2*n+5];
i int qp(ri x,ri y)
namespace poly
}int main()
洛谷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,...
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只要設到區間長度就可以了,其他的是用不到的。對前半部分也沒得影響...