題目鏈結
題目大意:給定\(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,...