首页 > 其他 > 详细

[hdu1402]A * B Problem Plus(NTT)

时间:2017-11-21 00:14:47      阅读:341      评论:0      收藏:0      [点我收藏+]

解题关键: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)

原文:http://www.cnblogs.com/elpsycongroo/p/7868738.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!