題解 P4721 模板 分治 FFT

2022-05-07 21:03:09 字數 1030 閱讀 6136

題目鏈結

題目大意:給定\(g_,f_0=1\),求\(f_\),其中\(f_i=\sum_^f_g_j\),對\(998244353\)取模

ntt、分治

分析:有兩種做法:首先可以多項式求逆(現在還不會)

然後可以用分治加上ntt(fft)優化卷積的方法

首先我們注意到,對於乙個位置\(i\),它依賴於\([0,i-1]\)處\(f\)的值,如果依次計算的話時間複雜度無法承受

這個時候可以用分治,計算一段區間內的\(f\)值對於另一段區間的貢獻

類似於\(cdq\)分治,我們計算完左區間後,考慮左區間會對右區間產生多少貢獻。這個直接將左區間的\(f\)和\(g\)做乙個卷積就可以了

#include #include #include #include using namespace std;

const int maxn = 3e5 + 100,mod = 998244353;

// g = 3,inv = 332748118

namespace fast_io

return *(p++);

}inline int read()

}using fast_io::read;

inline int add(int a,int b)

inline int sub(int a,int b)

inline int mul(int a,int b)

inline int qpow(int a,int b)

return res;

}inline int inv(int x)

int n,n,tr[maxn << 1],g[maxn << 1],f[maxn << 1],tmp1[maxn << 1],tmp2[maxn << 1];

inline void ntt(int f,int n,int flag)}}

}inline void cdq(int a,int b)

int main()

P4721 模板 分治 FFT

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

洛谷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,...