題目傳送門
給定乙個n次多項式f(x),和乙個m次多項式g(x)。
請求出f(x)和g(x)的卷積。
輸入格式:
第一行2個正整數n,m。
接下來一行n+1個數字,從低到高表示f(x)的係數。
接下來一行m+1個數字,從低到高表示g(x))的係數。
輸出格式:
一行n+m+1個數字,從低到高表示f(x)∗g(x)的係數。
輸入樣例#1:
1 21 21 2 1
輸出樣例#1:
1 4 5 2
保證輸入中的係數大於等於 0 且小於等於9。
對於100%的資料: $n, m \leq ^6$, 共計20個資料點,2s。
資料有一定梯度。
空間限制:256mb
分析:沒錯,這是一道fft模板,於是我們愉快地用ntt把它a了。
平常用的較多的都是fft,但是fft使用的是複數,需要開double型別,常數會比較大。但有時候我們需要求的都是整型,那麼用ntt(快速數論變換)就可以把常數降低很多。具體實現理論和fft基本無異,不過我們要把單位根換成原根,因為原根也滿足單位根的性質,最後就可得到乙個結論:$w_n \equiv g^ } \pmod p$。具體的理論推薦這位大佬的部落格。(吐槽一句,為什麼開了o2之後不管是fft還是ntt都反而更慢了???難道是我的**寫得太優秀???)
code:
#includeusingnamespace
std;
typedef
long
long
ll;const
int n=3e6+7
;const
int mod=998244353
;int
n,m,lim,r[n];
int g=3,gi=332748118
;ll a[n],b[n];
inline ll read()
while(ch>='
0'&&ch<='9')
return flag?-num:num;
}inline
void swap(ll &x,ll &y)
inline ll power(ll x,ll y)
return
ret;
}inline
void ntt(ll *a,int
type)} }
}int
main()
洛谷 P3803 模板 多項式乘法(FFT)
fft模板題 單向膜拜 從多項式乘法到快速傅利葉變換 fft 學習筆記 大致理解為將多項式從係數表示法轉化為點值表示法然後再變回係數表示法 include include include define n 2621450 define pi acos 1.0 using namespace std ...
洛谷P3803 模板 多項式乘法(FFT)
給定乙個 n 次多項式 f x 和乙個 m 次多項式 g x 請求出 f x 和 g x 的卷積。本來以為這個數論菜比只能背板的。結果差不多看懂了?強烈推薦 blog1 blog2 其實就是菜不想碼公式而已 fad。operatorname 增加了 ntt 實現 include define cp ...
P3803 模板 多項式乘法(FFT)
p3803 模板 多項式乘法 fft 給定乙個 n 次多項式 f x 和乙個 m 次多項式 g x 請求出 f x 和 g x 的卷積。從低到高輸出f x g x 的係數 另一種問法 如果有兩個無限序列a和b,那麼它們卷積的結果是 求出yn值 模板題建議背過模板 講的非常不錯的部落格 include...