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封装板子的主要内容,如果未能解决你的问题,请参考以下文章