题目背景
这是一道 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;
}