按照样例输入,输出是样例输出的四倍。
求调!谢谢!
#include <bits/stdc++.h>
#define debug(ss) cerr<<ss<<endl;
using namespace std;
const double pi=M_PI;
struct clex{
double re,im;
clex(double re=0,double im=0):re(re),im(im){}
clex operator+(const clex &rhs)const{return clex(re+rhs.re,im+rhs.im);}
clex operator-(const clex &rhs)const{return clex(re-rhs.re,im-rhs.im);}
clex operator*(const clex &rhs)const{return clex(re*rhs.re-im*rhs.im,re*rhs.im+im*rhs.re);}
clex operator+=(const clex &rhs){return *this=*this+rhs;}
clex operator-=(const clex &rhs){return *this=*this-rhs;}
clex operator*=(const clex &rhs){return *this=*this*rhs;}
};
vector<clex> a,b,c;
int lg2[(int)3e6+10],n,m,val,h;
void fft(vector<clex> &f,int ii){
if(f.size()==1) return;
int lf=f.size();
vector<clex> g,h;
for(int i=0;i<lf;++i){
if(i%2==0) g.push_back(f[i]);
else h.push_back(f[i]);
debug(1);
}
fft(g,ii),fft(h,ii);
double th=2*pi/(double)lf;
clex cur=clex(1,0),step=clex(cos(th),sin(ii*th));
for(int i=0;i<lf/2;++i){
f[i]=g[i]+cur*h[i];
f[i+lf/2]=g[i]-cur*h[i];
cur*=step;
debug(2);
}
debug(3);
}
int main(){
cin>>n>>m;
for(int i=2;i<=max(n,m);++i) lg2[i]=lg2[i/2]+1;
for(int i=0;i<=n;++i) cin>>val,a.push_back(val);
for(int i=0;i<=m;++i) cin>>val,b.push_back(val);
h=1<<(lg2[max(n,m)]+1);
while(a.size()!=h) a.push_back(0);
while(b.size()!=h) b.push_back(0);
fft(a,1),fft(b,1);
for(int i=0;i<h;++i) c.push_back(a[i]*b[i]);
fft(c,-1);
for(int i=0;i<n+m+1;++i) cout<<c[i].re<<" ";
return 0;
}