[模板]线性递推+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] ...
随机推荐
- Servlet 常用类
Servlet 是一套标准的接口规范,当用户通过web请求来访问服务器时,由web容器根据配置调用我们实现的对应的servlet对象来提供服务.同时为了方便开发,servlet标准中也提供了许多常用的 ...
- 抓取IOS的apsd进程流量
IOS的apsd是Apple Push Service的相关进程,很多系统服务都跟他有关,比如iMessage.Homekit,因此想抓包查看他是怎么实现的. 1.搜索发现相关资料很少,只有多年前的一 ...
- lamda表达式和尾置返回类型
基本lambda语法 基本形式如下: [capture](parameters) mutable ->return-type {body} [capture]:叫做捕获说明符,表示一个lambd ...
- dubbo rest服务(消费者) java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.engines.ApacheHttpClient4Engine 错误问题
1.版本 dubbo 2.7.3 2.描述 java.lang.ClassNotFoundException: org.jboss.resteasy.client.jaxrs.engines.Apac ...
- 使用 postman 给 API 写测试
使用 postman 给 API 写测试 Intro 上次我们简单介绍了 使用 postman 测试 API,这次主要来写一些测试用例以检查请求的响应是否符合我们的预期以及如何使用脚本测试 使用 po ...
- 急速搭建 Serverless AI 应用:为你写诗
前言 首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传.函数计算 ...
- mysql授权用户权限
mysql 用户管理和权限设置 用户管理 mysql>use mysql; 查看 mysql> select host,user,password from user ; 创建 mys ...
- 动态规划之用最少的字符操作将字符串A转换为字符串B
1.试用动态规划算法实现下列问题:设A和B是两个字符串.我们要用最少的字符操作,将字符串A转换为字符串B,这里所说的字符操作包括: (1)删除一个字符. (2)插入一个字符. (3)将一个字符改为另一 ...
- j接近50道经典SQL练习题,附建表SQL解题SQL
说明 本文章整理了47道常见sql联系题,包括建表语句,表结构,习题列表,解题答案都涵盖在本文章内.文末提供了所用SQL脚本下载链接.所有解题答案都是本人自己写的,广大读者如果在阅读使用中,有任何问题 ...
- Go网络编程
概述 网络协议 从应用的角度出发,协议可理解为"规则",是数据传输和数据的解释的规则.假设,A.B双方欲传输文件.规定: 第一次,传输文件名,接收方接收到文件名,应答OK给传输方: ...