NTT封装板子

Posted king-of-dark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NTT封装板子相关的知识,希望对你有一定的参考价值。

ll result_len,result[maxn],level=0,trans[maxn];
ll quick(ll a,ll b,ll m)
{
    ll ans=1;
    while(b>0)
    {
        if(b&1)
            ans=ans*a%m;
        a=a*a%m;
        b>>=1;
    }
    return ans;
}
inline void NTT(ll *A, int type) {
    for(int i = 0; i < result_len; i++)
        if(i < trans[i]) swap(A[i], A[trans[i]]);
    for(int mid = 1; mid < result_len; mid <<= 1) {
        ll Wn = quick( type == 1 ? G : Gi , (mod - 1) / (mid << 1),mod);
        for(int j = 0; j < result_len; j += (mid << 1)) {
            ll w = 1;
            for(int k = 0; k < mid; k++, w = (w * Wn) % mod) {
                 int x = A[j + k], y = w * A[j + k + mid] % mod;
                 A[j + k] = (x + y) % mod,
                 A[j + k + mid] = (x - y + mod) % mod;
            }
        }
    }
}
void ntt(ll *a,int a_len,ll *b,int b_len)
{
    result_len=1;level=0;
    while(result_len<=a_len+b_len)
    {
        result_len<<=1;
        level++;
    }
    for(int i=0;i<result_len;i++)
        trans[i]=(trans[i>>1]>>1)|((i&1)<<(level-1));
    NTT(a, 1);
    NTT(b, 1);
    for(int i=0;i<result_len;i++)
        result[i]=(a[i]*b[i])%mod;
    NTT(result,-1);
    ll inv=quick(result_len, mod-2, mod);
    for(int i=0;i<result_len;i++)
        result[i]=(result[i]*inv)%mod;
}

 

以上是关于NTT封装板子的主要内容,如果未能解决你的问题,请参考以下文章

NTT板子

NTT板子

分治FFT/NTT

hihocoder #1388 : Periodic Signal NTT&FFT

多项式板子(待补充)

VSCode自定义代码片段14——Vue的axios网络请求封装