多项式合集

FFT

#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ls (x<<1)
#define rs (x<<1|1)
#define db double
#define all(x)  x.begin(),x.end()
#define ll long long
#define pll pair<ll,ll>
#define pii pair<int,int>
#define eps 1e-9
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=4e5+7;
const int mod=1e9+7;
const double pi=acos(-1.0);
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
struct Complex
{
    double x,y;
    Complex(double xx=0,double yy=0)
    {
        x=xx;y=yy;
    }
}A[maxn],B[maxn];
Complex operator+(Complex p,Complex q)
{
    return Complex(p.x+q.x,p.y+q.y);
}
Complex operator*(Complex p,Complex q)
{
    return Complex(p.x*q.x-p.y*q.y,p.x*q.y+p.y*q.x);
}
Complex operator-(Complex p,Complex q)
{
    return Complex(p.x-q.x,p.y-q.y);
}
int lim=1,len=0;
int r[maxn];
int n;
char s1[maxn],s2[maxn];
int num[maxn];
void FFT(Complex* A,int op)
{
    for(int i=0;i<lim;i++)
    {
        if(i<r[i])swap(A[i],A[r[i]]);
    }
    for(int j=1;j<lim;j<<=1)
    {
        Complex tmp(cos(pi/j),op*sin(pi/j));
        for(int i=0;i<lim;i+=(j<<1))
        {
            Complex tt(1,0);
            for(int l=0;l<j;l++,tt=tt*tmp)
            {
                Complex t1=A[i+l],t2=A[i+j+l]*tt;
                A[i+l]=t1+t2;
                A[i+j+l]=t1-t2;
            }
        }
    }
}

int main()
{
    cin>>n;
    scanf("%s%s",s1,s2);
    for(int i=0;i<n;i++)A[i]=s1[n-i-1]-'0';
    for(int i=0;i<n;i++)B[i]=s2[n-i-1]-'0';
    while(lim<n*2)lim<<=1,len++;
    for(int i=0;i<=lim;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(len-1));
    FFT(A,1);FFT(B,1);
    for(int i=0;i<=lim;i++)A[i]=A[i]*B[i];
    FFT(A,-1);
    for(int i=0;i<=lim;i++)num[i]=(int)(A[i].x/lim+0.5);
    //cout<<lim<<"
";
    //for(int i=0;i<=lim;i++)cout<<A[i].x<<" ";cout<<"
";
    for(int i=0;i<lim;i++){
        num[i+1]+=num[i]/10,num[i]%=10;
    }
    //cout<<num[lim]<<"
";
    lim++;
    while(!num[lim]&&lim>0)lim--;
    for(int i=lim;i>=0;i--){
        cout<<num[i];
    }
}

  

NTT

#include<bits/stdc++.h>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define ls (x<<1)
#define rs (x<<1|1)
#define db double
#define all(x)  x.begin(),x.end()
#define ll long long
#define pll pair<ll,ll>
#define pii pair<int,int>
#define eps 1e-9
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=4e5+7;
const int mod=998244353;
const double pi=acos(-1.0);
inline ll read()
{
    ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
const int pr=3;
const int phi=mod-1;
int n,m;
int a[maxn],b[maxn],r[maxn];
int len=0;
int qpow(int a,int b)
{
    int res=1;
    while(b){
        if(b&1)res=1ll*res*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }return res;
}
void NTT(int *A,int op)
{
    for(int i=0;i<n;i++)if(i<r[i])swap(A[i],A[r[i]]);
    for(int i=1;i<n;i<<=1)
    {
        int W=qpow(pr,phi/(i<<1));
        for(int p=(i<<1),j=0;j<n;j+=p)
        {
            int w=1;
            for(int k=0;k<i;k++,w=1ll*w*W%mod)
            {
                int x=A[j+k],y=1ll*w*A[j+i+k]%mod;
                A[j+k]=(x+y)%mod;
                A[j+i+k]=(x-y+mod)%mod;
            }
        }
    }
    if(op==-1)reverse(A+1,A+n);
}
int main()
{
    cin>>n>>m;
    n++;m++;
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<m;i++)scanf("%d",&b[i]);
    m+=n;
    n=1;
    while(n<=m)n<<=1,len++;
    for(int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)<<(len-1));
    //cout<<n<<"
";
    NTT(a,1);NTT(b,1);
    for(int i=0;i<n;i++)a[i]=1ll*a[i]*b[i]%mod;
    //
    NTT(a,-1);//for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<"
";
    int inv=qpow(n,mod-2);
    for(int i=0;i<n;i++)a[i]=1ll*a[i]*inv%mod;
    for(int i=0;i<m-1;i++)printf("%d ",a[i]);printf("
");
}

  

原文地址:https://www.cnblogs.com/intwentieth/p/10831964.html