看了一天的多项式的内容,看博客的时候好像还是那么回事,一看题,哇塞,发现我其实连卷积是啥都没看懂。

qtdydb,背板子。 不知道卷积是啥就很伤了。

 

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

typedef long long LL;

inline int read()
{
    char c=getchar();int num=0,f=1;
    for(;!isdigit(c);c=getchar())
        f=c=='-'?-1:f;
    for(;isdigit(c);c=getchar())
        num=num*10+c-'0';
    return num*f;
}

const int N=4e6+5;
const double pi=acos(-1);

int n,m,bit,len=1;
int rev[N];

struct Complex
{
    double x,y;
    Complex(double xx=0,double yy=0){x=xx,y=yy;}
    Complex operator + (const Complex &A){return Complex(x+A.x,y+A.y);}
    Complex operator - (const Complex &A){return Complex(x-A.x,y-A.y);}
    Complex operator * (const Complex &A){return Complex(x*A.x-y*A.y,x*A.y+y*A.x);}
}a[N],b[N];

void fft(Complex *A,int dft)
{
    for(int i=0;i<len;++i)
        if(i<rev[i]) swap(A[i],A[rev[i]]);
    for(int step=1;step<len;step<<=1)
    {
        Complex wn(cos(pi/step),dft*sin(pi/step));
        for(int j=0;j<len;j+=(step<<1))
        {
            Complex wnk(1,0);
            for(int k=j;k<step+j;++k)
            {
                Complex x=A[k],y=wnk*A[k+step];
                A[k]=x+y,A[k+step]=x-y;
                wnk=wnk*wn;
            }
        }
    }
    if(dft==1) return;
    for(int i=0;i<=n+m;++i) A[i].x/=len;
}

int main()
{
    n=read(),m=read();
    for(int i=0;i<=n;++i) a[i].x=read();
    for(int i=0;i<=m;++i) b[i].x=read();
    while(len<=n+m) len<<=1,++bit;
    for(int i=0;i<len;++i) rev[i]=(rev[i>>1]>>1)|((i&1)<<(bit-1));
    fft(a,1),fft(b,1);
    for(int i=0;i<=len;++i) a[i]=a[i]*b[i];
    fft(a,-1);
    for(int i=0;i<=n+m;++i)
        cout<<(int)(a[i].x+0.5)<<' ';
    return 0;
}
View Code

相关文章:

  • 2021-05-26
  • 2021-07-05
  • 2022-12-23
  • 2021-04-16
  • 2021-06-18
  • 2022-12-23
猜你喜欢
  • 2022-01-01
  • 2021-06-15
  • 2022-01-09
  • 2021-10-05
  • 2022-12-23
相关资源
相似解决方案