也可用多項式求逆解決。
給定長度為 \(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,g[n-1]\),用空格隔開。
一行共 \(n\) 個非負整數,表示 \(f[0],f[1],\dots,f[n-1]\)模 \(998244353\) 的值。
\(2\leq n\leq 10^5\)
\(0\leq g[i]<998244353\)
其實就是用了一下\(\text\)分治而已,聽說比多項式求逆的應用範圍要廣一些 ,雖然複雜度是\(o(n\log^2n)\)的。
實現細節
code:
#include #include #define ll long long
const int n=(1<<18)+10;
const ll mod=998244353,g=3,gi=332748118;
#define mul(a,b) a*b%mod
ll qp(ll d,ll k)return f;}
ll f[n],g[n],a[n],b[n];
int n,len,l,turn[n];
void ntt(ll *a,int typ)
{ for(int i=0;i>1;
cdqfft(l,mid);
int m=r+1-l;
len=1,l=-1;
while(len<=m<<1) len<<=1,++l;
for(int i=0;i>1]>>1|(i&1)<2018.12.6
洛谷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
雖然說是fft但是還是寫了一發ntt 笑 然後忘了idft之後要除個n懵逼了好久 以及遞迴的時候忘了邊界無限re 樸素演算法 分治fft 考慮到題目要求求這樣的乙個式子 f x sigma f g 我們可以按定義暴力,然後再鬆式卡常 不是 我們可以發現它長得像乙個卷積一樣,但是因為後面的f值會依賴與...
洛谷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...