題目大意:給定長度為$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 stdinline 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...