莫名77分
查看原帖
莫名77分
556955
123wbl楼主2024/7/23 15:52
#include<iostream>
#include<cmath>
#include<cstdio>
#define re register
using namespace std;
inline int read()
{
    char ch=getchar();int flag=1,x=0;
    while(ch<'0'||ch>'9') {if(ch=='-') flag=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
    return x*flag;
}
const double pi=acos(-1.0);
struct complex
{
    double x,y;
    complex(double xx=0,double yy=0){x=xx,y=yy;}
}a[10000001],b[10000001];
complex operator + (complex a,complex b){return complex(a.x+b.x,a.y+b.y);}
complex operator - (complex a,complex b){return complex(a.x-b.x,a.y-b.y);}
complex operator * (complex a,complex b){return complex(a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x);}
int n,m;
int l,r[10000001];
int limit=1;
inline void FFT(complex *A,int type)
{
    for(re int i=0;i<limit;i++)
        if(i<r[i]) swap(A[i],A[r[i]]);
    for(int mid=1;mid<limit;mid<<=1)
    {
        complex wn(cos(pi/mid),type*sin(pi/mid));
        for(re int R=mid<<1,j=0;j<limit;j+=R)
        {
            complex w(1,0);
            for(re int k=0;k<mid;k++,w=w*wn)
            {
                complex x=A[j+k],y=w*A[j+mid+k];
                A[j+k]=x+y;
                A[j+mid+k]=x-y;
            }
        }
    }
}
int main()
{
    n=read(),m=read();
    for(re int i=0;i<=n;++i)   a[i].x=read();
    for(re int i=0;i<=m;++i)   b[i].x=read();
    while(limit<=n+m) limit<<=1,++l;
    for(re int i=0;i<limit;++i)
        r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
    FFT(a,1),FFT(b,1);
    for(re int i=0;i<=limit;i++) a[i]=a[i]*b[i];
    FFT(a,-1);
    for(re int i=0;i<=n+m;i++)
        printf("%d ",(int)(a[i].x/limit+0.5));
}

照着第一篇题解打的模板,#8#9TLE,每个点空间都有很大的占用,求调

2024/7/23 15:52
加载中...