标签:namespace algo ring 模板 res bsp color def int
解题关键:NTT模板
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> using namespace std; const int N=50010; typedef long long ll; ll G=3,P=469762049,a[3*N],b[3*N],wn[25]; char s[N],t[N]; ll mod_pow(ll x,ll n,ll p) { ll res=1;x%=p; while(n){ if(n&1) res=res*x%p; x=x*x%p; n>>=1; } return res; } void getwn(){ for(int i=0;i<25;i++) wn[i]=mod_pow(G,(P-1)/(1<<i),P);} void NTT(ll x[],int n,int rev){ int i,j,k,ds; ll w,u,v; for(i=1,j=n>>1,k=n>>1;i<n-1;i++,k=n>>1){//Rader if (i<j) swap(x[i],x[j]); while (j>=k){ j-=k;k>>=1; } if (j<k) j+=k; } for(i=2,ds=1;i<=n;i<<=1,ds++) for(j=0;j<n;j+=i){ w=1; for(k=j;k<j+i/2;k++){ u=x[k]%P;v=w*x[k+i/2]%P; x[k]=(u+v)%P; x[k+i/2]=(u-v+P)%P; w=w*wn[ds]%P; } } if(rev==-1){ for(i=1;i<n/2;i++) swap(x[i],x[n-i]); w=mod_pow(n,P-2,P); for(i=0;i<n;i++) x[i]=x[i]*w%P; } } void solve(){ int n=1,les=strlen(s),let=strlen(t); while(n<les+let) n<<=1; for(int i=0;i<les;i++) a[i]=s[les-i-1]-‘0‘; for(int i=les;i<n;i++) a[i]=0; for(int i=0;i<let;i++) b[i]=t[let-i-1]-‘0‘; for(int i=let;i<n;i++) b[i]=0; NTT(a,n,1);NTT(b,n,1); for (int i=0;i<n;i++) a[i]=a[i]*b[i]%P; NTT(a,n,-1); for(int i=0;i<n-1;i++) a[i+1]+=a[i]/10,a[i]%=10; while(n>1&&!a[n-1]) n--; for(n--;n>=0;n--) printf("%lld",a[n]); printf("\n"); } int main(){ getwn(); while (scanf("%s%s",s,t)!=EOF) solve(); return 0; }
[hdu1402]A * B Problem Plus(NTT)
标签:namespace algo ring 模板 res bsp color def int
原文地址:http://www.cnblogs.com/elpsycongroo/p/7868738.html