[模板]线性递推+BM
暴力版本:
#include<bits/stdc++.h>
#define mod 998244353
using namespace std;
typedef long long int ll;
const int maxn=1E4+;
const int inf=; ll A[maxn],B[maxn],tmp[maxn];
vector<ll>wait[maxn]; inline ll qpow(ll x,ll y)
{
ll ans=,base=x;
while(y)
{
if(y&)
ans=ans*base%mod;
base=base*base%mod;
y>>=;
}
return ans;
}
struct linear
{
vector<ll>val,a;
int fail[maxn],cnt;
ll delta[maxn];
inline void mul(ll*A,ll*B)
{
int k=a.size();
for(int i=;i<*k;++i)
tmp[i]=;
for(int i=;i<k;++i)
for(int j=;j<k;++j)
tmp[i+j]=(tmp[i+j]+A[i]*B[j])%mod;
for(int i=*k-;i>=k;--i)
for(int j=;j<k;++j)
tmp[i-j-]=(tmp[i-j-]+tmp[i]*a[j])%mod;
for(int i=;i<k;++i)
A[i]=tmp[i];
}
void qpowA(ll*A,ll*B,ll k)
{
while(k)
{
if(k&)
mul(A,B);
mul(B,B);
k>>=;
}
}
ll quickRecursion(ll n)
{
int k=a.size();
if(n<k)
return val[n];
for(int i=;i<k;++i)
A[i]=B[i]=;
A[]=;
B[]=;
qpowA(A,B,n);
ll ans=;
for(int i=;i<k;++i)
ans=(ans+A[i]*val[i])%mod;
return ans;
}
void BM()
{
cnt=;
for(int i=;i<(int)val.size();++i)
wait[i].clear();
for(int i=;i<(int)val.size();++i)
{
delta[i]=val[i];
for(int j=;j<(int)wait[cnt].size();++j)
delta[i]=(delta[i]-wait[cnt][j]*val[i-j-]%mod+mod)%mod;
if(delta[i]==)
continue;
fail[cnt]=i;
if(cnt==)
{
wait[++cnt].resize(i+);
continue;
}
int len=i-fail[cnt-]+wait[cnt-].size(),pos=cnt-;
for(int j=;j<cnt;++j)
if(i-fail[j]+(int)wait[j].size()<len)
len=i-fail[j]+wait[j].size(),pos=j;
ll g=delta[i]*qpow(delta[fail[pos]],mod-)%mod;
++cnt;
wait[cnt]=wait[cnt-];
while((int)wait[cnt].size()<len)
wait[cnt].push_back();
wait[cnt][i-fail[pos]-]=(wait[cnt][i-fail[pos]-]+g)%mod;
for(int j=;j<(int)wait[pos].size();++j)
wait[cnt][i-fail[pos]+j]=(wait[cnt][i-fail[pos]+j]-g*wait[pos][j]%mod+mod)%mod;
}
a.clear();
a=wait[cnt];
for(int i=;i<(int)a.size();++i)
cout<<a[i]<<" ";
cout<<endl;
}
}T;
int main()
{
ios::sync_with_stdio(false);
ll n,m;
cin>>n>>m;
for(int i=;i<=n;++i)
{
ll x;
cin>>x;
T.val.push_back(x);
}
T.BM();
cout<<T.quickRecursion(m)<<endl;
return ;
}
[模板]线性递推+BM的更多相关文章
- 模板 - 线性递推BM
模数是998244353的话好像NTT可以更快. #include<bits/stdc++.h> using namespace std; typedef long long ll; co ...
- LG5487 【模板】线性递推+BM算法
[模板]线性递推+BM算法 给出一个数列 \(P\) 从 \(0\) 开始的前 \(n\) 项,求序列 \(P\) 在\(\bmod~998244353\) 下的最短线性递推式,并在 \(\bmod~ ...
- 线性递推BM模板
#include <cstdio> #include<iostream> #include <cstring> #include <cmath> #in ...
- Berlekamp Massey算法求线性递推式
BM算法求求线性递推式 P5487 线性递推+BM算法 待AC. Poor God Water // 题目来源:ACM-ICPC 2018 焦作赛区网络预赛 题意 God Wate ...
- BM求线性递推模板(杜教版)
BM求线性递推模板(杜教版) BM求线性递推是最近了解到的一个黑科技 如果一个数列.其能够通过线性递推而来 例如使用矩阵快速幂优化的 DP 大概都可以丢进去 则使用 BM 即可得到任意 N 项的数列元 ...
- 【模板】BM + CH(线性递推式的求解,常系数齐次线性递推)
这里所有的内容都将有关于一个线性递推: $f_{n} = \sum\limits_{i = 1}^{k} a_{i} * f_{n - i}$,其中$f_{0}, f_{1}, ... , f_{k ...
- HDU - 6172:Array Challenge (BM线性递推)
题意:给出,三个函数,h,b,a,然后T次询问,每次给出n,求sqrt(an); 思路:不会推,但是感觉a应该是线性的,这个时候我们就可以用BM线性递推,自己求出前几项,然后放到模板里,就可以求了. ...
- 2018 焦作网络赛 L Poor God Water ( AC自动机构造矩阵、BM求线性递推、手动构造矩阵、矩阵快速幂 )
题目链接 题意 : 实际上可以转化一下题意 要求求出用三个不同元素的字符集例如 { 'A' .'B' .'C' } 构造出长度为 n 且不包含 AAA.BBB CCC.ACB BCA.CAC CBC ...
- 牛客多校第九场 A The power of Fibonacci 杜教bm解线性递推
题意:计算斐波那契数列前n项和的m次方模1e9 题解: $F[i] – F[i-1] – F[i-2] = 0$ $F[i]^2 – 2 F[i-1]^2 – 2 F[i-2]^2 + F[i-3] ...
随机推荐
- C语言中的符号总结
1.注释符号 //和/* ...*/ 2.续行符号 \ 3.转义符号 常用:\ ...
- Perl 的继承
Perl 类的定义 Perl的一个packag可以作为一个类使用,文件后缀名为.pm,并且把package里的函数当作类的方法来用.如: package Person; 创建和使用对象 大多数程序使用 ...
- pycharm 更改创建文件默认路径
1.操作 依次找到以下路径修改为自己想要的路径即可:PyCharm——>Settings——>Appearance&Behavior——>System Setting——&g ...
- jdbc链接Oracle数据库的封装
在src下创建properties文件 driver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@//127.0.0.1:1521/XEu ...
- 雪花算法 Snowflake & Sonyflake
唯一ID算法Snowflake相信大家都不墨生,他是Twitter公司提出来的算法.非常广泛的应用在各种业务系统里.也因为Snowflake的灵活性和缺点,对他的改造层出不穷,比百度的UidGener ...
- numpy :: 计算特征之间的余弦距离
余弦距离在计算相似度的应用中经常使用,比如: 文本相似度检索 人脸识别检索 相似图片检索 原理简述 下面是余弦相似度的计算公式(图来自wikipedia): 但是,余弦相似度和常用的欧式距离的有所区别 ...
- 面试官刁难:Java字符串可以引用传递吗?
老读者都知道了,六年前,我从苏州回到洛阳,抱着一幅"海归"的心态,投了不少简历,也"约谈"了不少面试官,但仅有两三个令我感到满意.其中有一位叫老马,至今还活在我 ...
- teamviewer早期版本下载链接
https://www.teamviewer.cn/cn/download/previous-versions/
- Linux安装MySQL及基本操作(Centos)
安装: 系统:CentOS-7-x86_64-DVD-1810.iso 安装命令: wget http://repo.mysql.com/mysql-community-release-el7-5.n ...
- Java散点
1.在Java中,所有需要保存在常量池中的数据,长度最大不能超过65535,这当然也包括字符串的定义