(模板)NTT

//const LL P = 50000000001507329LL; //190734863287 * 2 ^ 18 + 1 常数巨大  
//const int P = 1004535809LL; //479 * 2 ^ 21 + 1  
const int P = 1004535809; // 119 * 2 ^ 23 + 1  
const int G = 3;  
  
int a[N], b[N];  
int wn[25];  
int n;  

LL mul(LL x, LL y) {
    return (x * y - (LL)(x / (long double)P * y + 1e-3) * P + P) % P;
}


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;  
}  
  
void getwn() {  
    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;  
  
    for(int h = 2; h <= len; h <<= 1) {  
        ++id;  
        for(int j = 0; j < len; j += h) {  
            int w = 1;  
            for(int k = j; k < j + h / 2; ++k) {  
                int u = y[k];  
                int t = 1LL * y[k+h/2] * w % P;  
                y[k] = u + t;  
                if(y[k] >= P) y[k] -= P;  
                y[k+h/2] = u - t + P;  
                if(y[k+h/2] >= P) y[k+h/2] -= P;  
                w = 1LL * w * wn[id] % P;  
            }  
        }  
    }  
    if(on == -1) {  
        for(int i = 1; i < len / 2; ++i) swap(y[i], y[len-i]);  
        int inv = qpow(len, P - 2, P);  
        for(int i = 0; i < len; ++i)  
            y[i] = 1LL * y[i] * inv % P;  
    }  
}  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值