luogu P3803 【模板】多项式乘法(FFT)

题目背景

这是一道 FFT 模板题

题目描述

给定一个 n 次多项式 F(x),和一个 m 次多项式 G(x)。

请求出 F(x) 和 G(x) 的卷积。

输入格式

第一行 2 个正整数 n,m。

接下来一行 n+1 个数字,从低到高表示 F(x) 的系数。

接下来一行 m+1 个数字,从低到高表示 G(x) 的系数。

输出格式

一行 n+m+1 个数字,从低到高表示 F(x)*G(x) 的系数。


#include
#include
#include
#include
#include
using namespace std;
const double Pi=acos(-1);
#define db double
#define maxn 1350000
inline int read(){
  register char ch=0;
  while(ch<48||ch>57)ch=getchar();
  return ch-'0';
}
int n,m;
struct CP{
    CP (db xx=0,db yy=0){x=xx;y=yy;}
    db x,y;
    CP operator + (CP const &B)const
    {return CP(x+B.x,y+B.y);}
    CP operator - (CP const &B)const
    {return CP(x-B.x,y-B.y);}
    CP operator * (CP const &B)const
    {return CP(x*B.x-y*B.y,x*B.y+y*B.x);}
}f[maxn<<1];
int tr[maxn<<1];
inline void fft(CP *f,bool flag){
    for(int i=0;i>1;
        CP tG(cos(2*Pi/p),sin(2*Pi/p));
        if(!flag)tG.y*=-1;
        for(int k=0;k>1]>>1)|((i&1)?n>>1:0);
    fft(f,1);
    for(int i=0;i

风华的代码:

#include
#define N 2000005
using namespace std;
inline int read(){
    char ch=getchar();int x=0,f=1;
    while(!isdigit(ch)){
        if(ch=='-')f=-1;ch=getchar();
    }
    while(isdigit(ch)){
        x=x*10+ch-48;
        ch=getchar();
    }
    return x*f;
}
const double pi=acos(-1.0);
struct lex{
    double x,y;
    lex (double xx=0,double yy=0){
        x=xx;y=yy;
    }
    friend lex operator + (lex a,lex b){
        return (lex){a.x+b.x,a.y+b.y};
    }
    friend lex operator - (lex a,lex b){
        return (lex){a.x-b.x,a.y-b.y};
    }
    friend lex operator * (lex a,lex b){
        return (lex){a.x*b.x-a.y*b.y,a.y*b.x+a.x*b.y};
    }
}a[N<<1],b[N<<1];
int n,m,limit=1,l,r[N<<1];
void fft(lex *A,int type){
    for(int i=0;i>n>>m;
    for(int i=0;i<=n;++i)a[i].x=read();
    for(int i=0;i<=m;++i)b[i].x=read();
    while(limit<=n+m)limit<<=1,l++;
    for(int i=0;i>1]>>1)|((i&1)<<(l-1));
    }
    fft(a,1);
    fft(b,1);
    for(int i=0;i<=limit;++i)a[i]=a[i]*b[i];
    fft(a,-1);
    for(int i=0;i<=n+m;++i){
        printf("%d ",(int)(a[i].x/limit+0.5));
    }
    puts("");
    return 0;
}

你可能感兴趣的:(luogu P3803 【模板】多项式乘法(FFT))