• 常系数齐次线性递推


    存板子,这玩意死难写好像也没啥用啊

    不想学CH定理了,等以后学了再来补一下原理吧

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #define re register
    inline int read() {
        char c=getchar();int x=0,r=1;while(c<'0'||c>'9') {if(c=='-') r=-1;c=getchar();}
        while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x*r;
    }
    const int maxn=150005;
    const int mod=998244353;
    const int G[2]={3,(mod+1)/3};
    int n,m,__og[2][20],d[maxn],c[maxn],C[maxn],ans[maxn],len,rev[maxn];
    int a[maxn],g[maxn],rg[maxn],ig[maxn],K[maxn],ra[maxn];
    inline int ksm(int a,int b) {
        int S=1;
        for(;b;b>>=1,a=1ll*a*a%mod) if(b&1) S=1ll*S*a%mod;
        return S;
    }
    inline void NTT(int *f,int o) {
        for(re int i=0;i<len;i++) if(i<rev[i]) std::swap(f[i],f[rev[i]]);
        for(re int og1,p=0,i=2,ln=1;i<=len;p++,i<<=1,ln<<=1) {
            if(!__og[o][p]) og1=__og[o][p]=ksm(G[o],(mod-1)/i);
                else og1=__og[o][p];
            for(re int t,og=1,l=0;l<len;l+=i,og=1) 
                for(re int x=l;x<l+ln;++x) {
                    t=1ll*og*f[x+ln]%mod;og=1ll*og*og1%mod;
                    f[x+ln]=(f[x]-t+mod)%mod,f[x]=(f[x]+t)%mod;
                }
        }
        if(!o) return;
        int Inv=ksm(len,mod-2);
        for(re int i=0;i<len;i++) f[i]=1ll*f[i]*Inv%mod;
    }
    inline void Inv(int n,int *A,int *B) {
        if(n==1) {B[0]=ksm(A[0],mod-2);return;}
        Inv((n+1)>>1,A,B);
        len=1;while(len<n+n-1) len<<=1;
        for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
        for(re int i=0;i<n;i++) C[i]=A[i];for(re int i=n;i<len;i++) C[i]=0;
        NTT(C,0),NTT(B,0);
        for(re int i=0;i<len;i++) B[i]=(2ll*B[i]-1ll*C[i]*B[i]%mod*B[i]%mod+mod)%mod;
        NTT(B,1);for(re int i=n;i<len;i++) B[i]=0;
    }
    inline void Rev(int n,int *A,int *B) {
        for(re int i=n;i<len;i++) A[i]=0;
        for(re int i=0;i<n;i++) A[i]=B[n-i-1];
    }
    inline void getmod(int *A) {
        int now=m+m-1;while(!A[now]) now--;
        if(now<m) return;
        Rev(now+1,ra,A);NTT(ra,0);
        for(re int i=0;i<len;i++) ra[i]=1ll*ra[i]*ig[i]%mod;
        NTT(ra,1);Rev(now-m+1,K,ra);NTT(K,0);
        for(re int i=0;i<len;i++) K[i]=1ll*K[i]*g[i]%mod;
        NTT(K,1);
        for(re int i=0;i<m;i++) A[i]=(A[i]-K[i]+mod)%mod;
        for(re int i=m;i<=now;i++) A[i]=0;
    }
    int main() {
        n=read(),m=read();
        for(re int i=1;i<=m;i++) c[i]=(read()+mod)%mod;
        for(re int i=0;i<m;i++) d[i]=(read()+mod)%mod;
        for(re int i=1;i<=m;i++) g[m-i]=(mod-c[i])%mod;g[m]=1;
        a[1]=ans[0]=1;
        len=1;while(len<=m) len<<=1;len<<=1;
        Rev(m+1,rg,g);Inv(len,rg,ig);
        for(re int i=0;i<len;i++) rev[i]=rev[i>>1]>>1|((i&1)?len>>1:0);
        NTT(g,0),NTT(ig,0);
        while(n) {
            if(n&1) {
                NTT(ans,0);NTT(a,0);
                for(re int i=0;i<len;i++) ans[i]=1ll*ans[i]*a[i]%mod;
                NTT(a,1),NTT(ans,1);getmod(ans);
            }
            n>>=1;NTT(a,0);
            for(re int i=0;i<len;i++) a[i]=1ll*a[i]*a[i]%mod;
            NTT(a,1);getmod(a);
        } 
        int Ans=0;
        for(re int i=0;i<m;i++) Ans=(Ans+1ll*ans[i]*d[i]%mod)%mod;
        printf("%d
    ",Ans);
        return 0;
    }
    
  • 相关阅读:
    面试整理之DOM事件阶段
    头疼的闭包
    Bootstrap学习
    旁门左道通过JS与纯CSS实现显示隐藏层
    关于setTimeout的妙用前端函数节流
    兼容古董级IE小结
    Mongodb配置:error:10061 由于目标计算机积极拒绝,无法连接
    webpack入门前端必备
    团队成员的分应该怎么分?
    Start
  • 原文地址:https://www.cnblogs.com/asuldb/p/10959495.html
Copyright © 2020-2023  润新知