// 多项式乘法 系数对MOD=1000000007取模, 常数巨大,慎用
// 只要选的K个素数乘积大于MOD*MOD*N,理论上MOD可以任取。
#define MOD 1000000007
#define K 3
const int m[K] = {1004535809, 998244353, 104857601};
#define G 3
int qpow(int x, int k, int P) {
int ret = 1;
while(k) {
if(k & 1) ret = 1LL * ret * x % P;
k >>= 1;
x = 1LL * x * x % P;
}
return ret;
}
struct _NTT {
int wn[25], P;
void init(int _P) {
P = _P;
for(int i = 1; i <= 21; ++i) {
int t = 1 << i;
wn[i] = qpow(G, (P - 1) / t, P);
}
}
void change(int *y, int len) {
for(int i = 1, j = len / 2; i < len - 1; ++i) {
if(i < j) swap(y[i], y[j]);
int k = len / 2;
while(j >= k) {
j -= k;
k /= 2;
}
j += k;
}
}
void NTT(int *y, int len, int on) {
change(y, len);
int id = 0;
(模板)多项式乘法对任意数取模
最新推荐文章于 2021-03-25 11:48:04 发布
该博客介绍了如何利用NTT(快速数位变换)算法进行多项式乘法,并对结果进行模操作,特别是针对模数MOD=1000000007的情况。博客中详细解释了NTT的初始化、位翻转、蝶形运算等步骤,并展示了如何结合中国剩余定理(CRT)解决多个模数下的乘法问题。
摘要由CSDN通过智能技术生成