今天的a題,裸的ntt,但我不會,於是白送了50分。
於是跑來學一下ntt。
題面很簡單,就懶得貼了,那不是我要說的重點。
重點是ntt,也稱快速數論變換。
在很多問題中,我們可能會遇到在模意義下的多項式乘法問題,這時傳統的快速傅利葉變換可能就無法滿足要求,這時候快速數論變換就派上了用場。
考慮快速傅利葉變換的實現,利用單位復根的特殊性質來減少運算,而利用的,就是dft變換的迴圈卷積特性。於是考慮在模意義下同樣具有迴圈卷積特性的東西。
考慮在模p意義下(
p 為特定的質數,滿足p=
c∗2n
+1) 我們令
p 的乙個原根為
g,於是模擬fft,我們的單位根為gp
−1n ,然後其它的處理都模擬fft。
upd:這是uoj34的**
#include
using namespace std;
typedef long long ll;
typedef double db;
const int inf=0x3f3f3f3f;
int getint()
while(c>='0' && c<='9')g=(g<<3)+(g<<1)+c-'0',c=getchar();
return f*g;
}const int maxn=300005;
const int mod=998244353;
const int g=3;
int a[maxn];
int b[maxn];
int c[maxn];
int n,m;
int rev[maxn];
int n;
int len;
int inv;
int power(ll x,ll y)
return res;
}void init()
rev[i]=pos;
}}void ntt(int
*a,int n,int re)
}for(int i=2;i<=n;i<<=1)}}
if(re)
}}int main()
for(int i=0;i<=m;i++)
init();
ntt(a,n,0);
ntt(b,n,0);
for(int i=0;i<=n;i++)
ntt(c,n,1);
for(int i=0;i<=n+m;i++)
return
0;}
模板 快速數論變換 NTT
code 對比先要把fft學習清楚才能進行.因為基本原理都是一樣的.fft是根據複數和n nn次單位根構造演算法的.但是,使用複數和單位根有以下兩個缺點 複數運算計算量大,常數比較高 複數是基於dou bledouble double 運算的,可能會出現精度誤差 這兩個缺點都很致命.但是,我們經常接...
高速數論變換 NTT
今天的a題。裸的ntt,但我不會,於是白送了50分。於是跑來學一下ntt。題面非常easy。就懶得貼了,那不是我要說的重點。重點是ntt,也稱高速數論變換。在非常多問題中,我們可能會遇到在模意義下的多項式乘法問題,這時傳統的高速傅利葉變換可能就無法滿足要求,這時候高速數論變換就派上了用場。考慮高速傅...
fjut3283 NTT快速數論變換
題解 我們將b序列反轉那麼最後就會變成 a0,a1,a2,an 1 b0,a1,b2.bn 1 那麼答案將變成a0 bi a1 bi 1 ai b0 ai 1 bn 1 ai 2 bn 2 an 1 bi 1然後你會發現答案就是多項式乘法,指數相加等於i的係數加上指數相加等於i n的係數就是答案,因...