洛谷 P4721 模板 分治 FFT 解題報告

2022-04-30 01:09:12 字數 969 閱讀 8026

也可用多項式求逆解決。

給定長度為 \(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...