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

Posted naruto-mzx

tags:

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

题目描述

给你两个正整数 a,b,求 a×b。

输入格式

第一行一个正整数,表示 a;
第二行一个正整数,表示 b。

输出格式

输出一行一个整数表示答案。

#include<cmath>
#include<string>  
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int _=4e6+10;
const double Pi=acos(-1.0);
#define db double
struct lex{
    db x,y;
    lex(db _x=0,db _y=0){x=_x;y=_y;}
    lex operator + (const lex &b)const{return lex(x+b.x,y+b.y);}
    lex operator - (const lex &b)const{return lex(x-b.x,y-b.y);}
    lex operator * (const lex &b)const{return lex(x*b.x-y*b.y,x*b.y+y*b.x);}
}a[_],b[_];
int N,M;
inline void fft(int lim,lex *a,int op){
    if(lim==1)return;
    lex a1[(lim>>1)+5],a2[(lim>>1)+5];
    for(int i=0;i<lim;i+=2)a1[i>>1]=a[i],a2[i>>1]=a[i+1];
    fft(lim>>1,a1,op);
    fft(lim>>1,a2,op);
    lex Wn=lex(cos(2.0*Pi/lim),op*sin(2.0*Pi/lim));
    lex w=lex(1,0);
    for(int i=0;i<(lim>>1);i++,w=w*Wn){
        a[i]=a1[i]+w*a2[i];
        a[i+(lim>>1)]=a1[i]-w*a2[i];
    }
}
int ans[_],AA,BB;
signed main(){
    string s1,s2; cin>>s1>>s2;
    N=s1.length(); M=s2.length();
    register int i;
    for(i=N-1;i>=0;i--)a[AA++].x=s1[i]-'0';
    for(i=M-1;i>=0;i--)b[BB++].x=s2[i]-'0';
    register int lim=1; while(lim<=N+M)lim<<=1;
    fft(lim,a,1);
    fft(lim,b,1);
    for(i=0;i<=lim;i++)a[i]=a[i]*b[i];
    fft(lim,a,-1);
    for(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,lim+=(i==lim);
    }
    while(!ans[lim] && lim >= 1) lim -- ;
    lim ++ ;
    while(--lim>= 0)printf("%d",ans[lim]);
    return 0 ;
}

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

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

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

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

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

Luogu2005 A/B Problem II

luogu P1865 A % B Problem题解