任意模數NTT學習筆記

2022-03-29 22:44:58 字數 1338 閱讀 7990

這兩天有點頹,所以東西學的也很慢。。。這個一眼就能推出來的活生生卡了我兩天。。

說幾個細節:

柿子:\(m\)通常設定為\(32768\)。把上一步的幾個韓束化成\(a,b,c,d\)的形式,答案就是:

一看卷積,多搞幾次\(fft\)就過去了。

陣列記得開大。\(n<<2\)左右。

#include using namespace std;

#define int long long

#define double long double

const int n = 600010;

const double pi = acos (-1);

int n, m, p, lim = 1, f[n], g[n], rev[n], res[n];

struct complex

complex operator + (complex rhs)

complex operator - (complex rhs)

complex operator * (complex rhs)

}a[n], b[n], c[n], d[n], t1[n], t2[n], t3[n], t4[n];

const int m = 32768;

signed add (int x, int y)

signed mul (int x, int y)

void fast_fast_tle (complex *a, int type)

}for (int mid = 1; mid < lim; mid <<= 1) }}

if (type == -1)

}}signed main ()

for (int i = 0; i <= m; ++i)

while (lim <= n + m) lim <<= 1;

for (int i = 0; i < lim; ++i)

fast_fast_tle (a, 1), fast_fast_tle (b, 1); fast_fast_tle (c, 1), fast_fast_tle (d, 1);

for (int i = 0; i < lim; ++i)

fast_fast_tle (t1, -1), fast_fast_tle (t2, -1); fast_fast_tle (t3, -1), fast_fast_tle (t4, -1);

for (int i = 0; i < lim; ++i)

for (int i = 0; i <= n + m; ++i) printf ("%lld ", res[i]);

}

任意模數ntt 任意模數NTT

任意模數 ntt 眾所周知,為了滿足單位根的性質,ntt 需要質數模數,而且需要能寫成 a2 1 且 2 k ge n 比較常用的有 998244353,1004535809,469762049 這三個原根都是 3 如果要任意模數怎麼辦?n 次多項式在模 m 下乘積,最終係數一定不會大於 nm 2 ...

任意模數ntt 模板篇 NTT和三模數NTT

之前寫過fft的筆記.我們知道fft是在複數域上進行的變換.而且經過數學家的證明,dft是複數域上唯一滿足迴圈卷積性質的變換.而我們在oi中,經常遇到對 x取模的題目,這就啟發我們可不可以在模運算的意義下找乙個這樣的變換.然後我們發現有個神奇的東西,原根 g 這東西在模意義下相當於單位復根 e 所以...

任意模數NTT 拆係數FFT

給定 2 個多項式 f x g x 請求出 f x g x 係數對 p 取模,且不保證 p 可以分解成 p a cdot 2 k 1 之形式。不關心 1 leq n leq 10 5,0 leq a i,b i leq 10 9,2 leq p leq 10 9 9 現在這裡有兩個多項式 a x b...