$\text{O}(n \log n)$ 多项式运算


贴个老板子

namespace Modsqrt{
 
    #define ll long long
 
    ll w2;
 
    struct CP{
        ll x,y;
        CP() {}
        CP(ll x,ll y):x(x),y(y) {}
        CP operator *(const CP &a) const{
            ll X=(x*a.x+y*a.y%mod*w2)%mod;
            ll Y=(x*a.y+y*a.x)%mod;
            return CP(X,Y);
        }
    };
 
    inline CP CP_qpow(CP a,int b){
        CP ans=CP(1,0);
        for(;b;b>>=1){
            if(b&1)ans=ans*a;
            a=a*a;
        }
        return ans;
    }
 
    inline ll modsqrt(ll x){
        srand(time(0));
        ll y=1ll*rand()*rand()%mod;
        while(qpow(w2=(y*y+mod-x)%mod,(mod-1)>>1)==1)
            y=1ll*rand()*rand()%mod;
        CP ans=CP_qpow(CP(y,1),(mod+1)>>1);
        return min(ans.x,mod-ans.x);
    }
 
    #undef ll
 
}
 
using namespace Modsqrt;
 
long long inv[maxn],frac[maxn],invf[maxn];
 
inline void Init_Inv(int N){
    frac[0]=1;
    for(int i=1;i<=N;i++)frac[i]=frac[i-1]*i%mod;
    invf[N]=qpow(frac[N],mod-2);
    for(int i=N;i>=1;i--)invf[i-1]=invf[i]*i%mod;
    for(int i=1;i<=N;i++)inv[i]=invf[i]*frac[i-1]%mod;
}
 
inline void init(int N){
    Init_Inv(N);
}
 
namespace Polyn{
 
    #define G 3
 
    #define ll long long
 
    int lstn,rev[maxn];
 
    long long g[2][33];
 
    inline void cpy(int N,ll *a,ll *b){
        for(int i=0;i0){
            for(int i=N-1;i>=len;i--)a[i]=a[i-len];
            for(int i=len-1;i>=0;i--)a[i]=0;
        }
        else {
            len=-len;
            for(int i=0;i=1;i--){
            g[0][i]=g[0][i+1]*g[0][i+1]%mod;
            g[1][i]=g[1][i+1]*g[1][i+1]%mod;
        }
    }
 
    inline void init(int N){
        if(lstn==N)return;
        lstn=N;
        for(int i=1;i>1)]>>1)|(i&1?(N>>1):0);
    }
 
    inline void Der(int N,ll *f){
        for(int i=1;i>1,A,ans);
            cpy(len,B,f);
            Mul(len,A,B);
            clr(len>>1,A);
            cpy(len,B,ans);
            Mul(len,A,B);
            for(int i=(len>>1);i=MOD)return;
        cpy(n,ans,f);
        mve(n,-x,ans);
        int m=MOD-x;
        if(ans[0]>1){
            ll inv0=qpow(ans[0],mod-2);
            for(int i=0;i1)Mul(MOD,ans,qpow(f[x],k1));
    }
 
    #undef ll
 
    #undef G
 
}
 
long long A[maxn];
 
struct P{
 
    #define ll long long
 
    int n;
 
    ll f[maxn];
 
    inline void Read(){
        for(int i=0;i();
    }
 
    inline void Print(){
        for(int i=0;i