[模板]线性递推+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] ...
随机推荐
- 北京师范大学第十七届程序设计竞赛决赛 G
传送门:https://ac.nowcoder.com/acm/contest/895/G 题意: \[ 操作 1:L,R,X,Y,对所有L≤i≤R赋值 \\ Ai=min(Ai,(i−L)×Y+X) ...
- grep工具
全面搜索正则表达式(Global search regular expression(RE) ,GREP)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来. Unix/Lin ...
- 一键自动生成 java junit 测试代码神器 gen-test-plugin 入门介绍
gen-test-plugin 我们日常编写代码的过程中,经常需要为代码编写测试案例. 随着对代码质量的要求越来越高,很多公司开始通过代码的测试覆盖率作为 QA 的一个评定指标. 本框架可以一键生成所 ...
- 最小生成树+LCA不能算最小环!!!!!!!
- Java第一次创建对象速度比之后慢的原因
类的对象在第一次创建的时候,Java虚拟机(JVM)首先检查是否所要加载的类对应的Class对象是否已经加载.如果没有加载,JVM就会根据类名查找.class文件,并将其Class对象载入.一般某个类 ...
- 洛谷训练新手村之“BOSS战-入门综合练习2”题解
P1426 小鱼会有危险吗 题目链接:https://www.luogu.com.cn/problem/P1426 题目大意: 有一次,小鱼要从A处沿直线往右边游,小鱼第一秒可以游7米,从第二秒开始每 ...
- Serverless Kubernetes 入门:对 Kubernetes 做减法
作者 | 贤维 阿里巴巴高级技术专家 导读:Serverless Kubernetes 是阿里云容器服务团队对未来 Kubernetes 演进方向的一种探索,通过对 Kubernetes 做减法,降 ...
- Jenkins2构建pipeline流水线
流水线有两种方式: 1.脚本式流水线 2.声明式流水线 构建流水线的简单示例: 脚本式流水线 node ('master'){ stage("Source"){ //从Git仓库中 ...
- Go Goosy Disk Docker Port Provisioners(GDP)
小伙伴们,她们中出了一个叛徒,他是谁?是谁?是谁? 由一则口口相传的故事开始吧: 中午吃饭时间抽空小李跑到同座大楼的小张公司串门,小李是一名docker顾问熟称砖家,这间公司老板想挖小李,他盯了前台不 ...
- 图解kubernetes scheduler基于map/reduce模式实现优选阶段
优选阶段通过分map/reduce模式来实现多个node和多种算法的并行计算,并且通过基于二级索引来设计最终的存储结果,从而达到整个计算过程中的无锁设计,同时为了保证分配的随机性,针对同等优先级的采用 ...