mx求助
查看原帖
mx求助
322792
Alea楼主2024/7/4 23:57

按照样例输入,输出是样例输出的四倍。

求调!谢谢!

#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;
}
2024/7/4 23:57
加载中...