• [模板]线性递推+BM


    暴力版本:

      1 #include<bits/stdc++.h>
      2 #define mod 998244353
      3 using namespace std;
      4 typedef long long int ll;
      5 const int maxn=1E4+5;
      6 const int inf=2333333;
      7 
      8 ll A[maxn],B[maxn],tmp[maxn];
      9 vector<ll>wait[maxn];
     10 
     11 inline ll qpow(ll x,ll y)
     12 {
     13     ll ans=1,base=x;
     14     while(y)
     15     {
     16         if(y&1)
     17             ans=ans*base%mod;
     18         base=base*base%mod;
     19         y>>=1;
     20     }
     21     return ans;
     22 }
     23 struct linear
     24 {
     25     vector<ll>val,a;
     26     int fail[maxn],cnt;
     27     ll delta[maxn];
     28     inline void mul(ll*A,ll*B)
     29     {
     30         int k=a.size();
     31         for(int i=0;i<2*k;++i)
     32             tmp[i]=0;
     33         for(int i=0;i<k;++i)
     34             for(int j=0;j<k;++j)
     35                 tmp[i+j]=(tmp[i+j]+A[i]*B[j])%mod;
     36         for(int i=2*k-1;i>=k;--i)
     37             for(int j=0;j<k;++j)
     38                 tmp[i-j-1]=(tmp[i-j-1]+tmp[i]*a[j])%mod;
     39         for(int i=0;i<k;++i)
     40             A[i]=tmp[i];
     41     }
     42     void qpowA(ll*A,ll*B,ll k)
     43     {
     44         while(k)
     45         {
     46             if(k&1)
     47                 mul(A,B);
     48             mul(B,B);
     49             k>>=1;
     50         }
     51     }
     52     ll quickRecursion(ll n)
     53     {
     54         int k=a.size();
     55         if(n<k)
     56             return val[n];
     57         for(int i=0;i<k;++i)
     58             A[i]=B[i]=0;
     59         A[0]=1;
     60         B[1]=1;
     61         qpowA(A,B,n);
     62         ll ans=0;
     63         for(int i=0;i<k;++i)
     64             ans=(ans+A[i]*val[i])%mod;
     65         return ans;
     66     }
     67     void BM()
     68     {
     69         cnt=0;
     70         for(int i=0;i<(int)val.size();++i)
     71             wait[i].clear();
     72         for(int i=0;i<(int)val.size();++i)
     73         {
     74             delta[i]=val[i];
     75             for(int j=0;j<(int)wait[cnt].size();++j)
     76                 delta[i]=(delta[i]-wait[cnt][j]*val[i-j-1]%mod+mod)%mod;
     77             if(delta[i]==0)
     78                 continue;
     79             fail[cnt]=i;
     80             if(cnt==0)
     81             {
     82                 wait[++cnt].resize(i+1);
     83                 continue;
     84             }
     85             int len=i-fail[cnt-1]+wait[cnt-1].size(),pos=cnt-1;
     86             for(int j=0;j<cnt;++j)
     87                 if(i-fail[j]+(int)wait[j].size()<len)
     88                     len=i-fail[j]+wait[j].size(),pos=j;
     89             ll g=delta[i]*qpow(delta[fail[pos]],mod-2)%mod;
     90             ++cnt;
     91             wait[cnt]=wait[cnt-1];
     92             while((int)wait[cnt].size()<len)
     93                 wait[cnt].push_back(0);
     94             wait[cnt][i-fail[pos]-1]=(wait[cnt][i-fail[pos]-1]+g)%mod;
     95             for(int j=0;j<(int)wait[pos].size();++j)
     96                 wait[cnt][i-fail[pos]+j]=(wait[cnt][i-fail[pos]+j]-g*wait[pos][j]%mod+mod)%mod;
     97         }
     98         a.clear();
     99         a=wait[cnt];
    100         for(int i=0;i<(int)a.size();++i)
    101             cout<<a[i]<<" ";
    102         cout<<endl;
    103     }
    104 }T;
    105 int main()
    106 {
    107     ios::sync_with_stdio(false);
    108     ll n,m;
    109     cin>>n>>m;
    110     for(int i=1;i<=n;++i)
    111     {
    112         ll x;
    113         cin>>x;
    114         T.val.push_back(x);
    115     }
    116     T.BM();
    117     cout<<T.quickRecursion(m)<<endl;
    118     return 0;
    119 }
    View Code
  • 相关阅读:
    解决ORACLE存储过程锁定的问题
    #{propName,attr1=val1,attr2=val2}
    集成confluence与jira
    jira4.1.1安装
    Mac OS X 10.6下安装MySQL 5.1.45
    JIRA+MySQL配置
    xcode4.5 iOS6 cocos2dx 横屏解决方案
    gSoap
    Jira5.0.2安装及破解
    MFC中显示cocos2dx
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/11335871.html
Copyright © 2020-2023  润新知