快速數論變換 NTT

2021-07-03 16:51:51 字數 1304 閱讀 3619

今天的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的係數就是答案,因...