zoukankan      html  css  js  c++  java
  • 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=a_len;i<result_len;i++)

    
    

            a[i]=0;

    
    

          for(int i=b_len;i<result_len;i++)

    
    

            b[i]=0;

    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;
    }
  • 相关阅读:
    python每日活力练习Day29
    python活力练习Day28
    python活力练习Day27
    pyhton 活力练习Day26
    排序算法之归并排序
    排序算法之快速排序
    Python 多线程
    排序算法之希尔排序
    排序算法之插入排序
    ELK(elasticsearch+kibana+logstash)搜索引擎(一): 环境搭建
  • 原文地址:https://www.cnblogs.com/King-of-Dark/p/13024501.html
Copyright © 2011-2022 走看看