P1919 模板A*B Problem升级版(FFT快速傅里叶)

Posted zzctommy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P1919 模板A*B Problem升级版(FFT快速傅里叶)相关的知识,希望对你有一定的参考价值。

P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

思路还是挺简单的。

输入的2个数 (a=overline{a_n a_{n-1} a_{n-2}cdots a_{0}}) , (b=overline{b_m b_{m-1} b_{m-2}cdots b_{0}})

直接把 (a_i)(b_i) 看做多项式 A 和 B 的系数,做多项式乘法即可。因为 a ,b 可以看做以 (a_i,b_i) 为系数,自变量为10的多项式的值,乘完后的多项式的系数就知道了,再将 (x=10) 带入,(就是进位的过程),就可解了。(也可以把这一过程看做加速朴素的高精度乘法,因为 (a_i imes x^i + b_j imes x^j =a_i imes b_j imes x^{i+j}) ,高精度乘法模拟的也是这个过程。)

Code

#include<bits/stdc++.h>
using namespace std;
const int N=3000006;
const double pi=acos(-1.0);
struct cp {
    double x,y;
    cp (double xx=0,double yy=0) {
        x=xx,y=yy;
    }
} a[N],b[N];
cp operator + (const cp &a,const cp &b) {
    return cp(a.x+b.x,a.y+b.y);
}
cp operator - (const cp &a,const cp &b) {
    return cp(a.x-b.x,a.y-b.y);
}
cp operator * (const cp &a,const cp &b) {
    return cp(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);
}
int n,m,lim=1,l,rev[N];
void fft(cp *a,int o) {
    for(int i=0; i<lim; ++i)
        if(i<rev[i])swap(a[i],a[rev[i]]);
    for(int i=1; i<lim; i<<=1) {
        cp wn(cos(pi/i),o*sin(pi/i));
        for(int j=0; j<lim; j+=(i<<1)) {
            cp w0(1,0);
            for(int k=0; k<i; ++k,w0=w0*wn) {
                cp X=a[j+k],Y=w0*a[i+j+k];
                a[j+k]=X+Y;
                a[i+j+k]=X-Y;
            }
        }
    }
}
char s1[N],s2[N];
int ans[N+N],tot;
int main() {
    scanf("%s%s",s1,s2);
    n=strlen(s1)-1;m=strlen(s2)-1;
    for(int i=0; i<=n; ++i)a[i].x=s1[n-i]-'0';
    for(int i=0; i<=m; ++i)b[i].x=s2[m-i]-'0';
    for(; lim<=n+m; lim<<=1,++l);
    for(int i=0; i<lim; ++i)rev[i]=(rev[i>>1]>>1)|((i&1)<<(l-1));
    fft(a,1);fft(b,1);
    for(int i=0; i<lim; ++i)a[i]=a[i]*b[i];
    fft(a,-1);
    for(int i=0; i<lim; ++i)
    {
        ans[i]+=(int)(a[i].x/lim+0.5);
        if(ans[i]>=10)ans[i+1]+=ans[i]/10,ans[i]%=10;
    }
    while(!ans[lim]&&lim)--lim;
    for(int i=lim;i>=0;--i)
        printf("%d",ans[i]);
    return 0;
}

以上是关于P1919 模板A*B Problem升级版(FFT快速傅里叶)的主要内容,如果未能解决你的问题,请参考以下文章

luogu P1919 模板A*B Problem升级版(FFT快速傅里叶)|FFT

洛谷P1919 模板A*B Problem升级版 题解(FFT的第一次实战)

洛谷P1919 模板A*B Problem升级版(FFT快速傅里叶)

洛谷.1919.[模板]A乘B Problem升级版(FFT)

[Luogu 1919]模板A*B Problem升级版(FFT快速傅里叶)

P2522 [HAOI2011]Problem b