bzoj 4161 Shlw loves matrixI——常系数线性齐次递推
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4161
还是不能理解矩阵……
关于不用矩阵理解的方法:https://blog.csdn.net/joker_69/article/details/80869814
关于这道题:https://blog.csdn.net/sdfzyhx/article/details/63697273
现在只会 O(k2logn) 的做法。
很多题解的写法是快速幂到多项式的 n-(k-1) 次,用递推式暴力把给出的 \(h_0,...,h_{k-1}\) 扩展到 \( h_0,...,h_{2*(k-1)} \) ,然后用 \( h_{k-1},...,h_{2*(k-1)} \) 乘上刚才做出的多项式得到答案。关于这个的理解:
现在的多项式可以看作是转移矩阵 M 的 n-(k-1) 次幂的第一列。考虑到原来的值向量对应位乘上该多项式就是第 n-(k-1) 次项的答案,所以大概可以这样考虑?
所以这个多项式可以在 \( h_i,...,h_{i+k-1} \) 乘上它的情况下得到 \( h_{i+n-(k-1)} \) 的答案。
但直接把多项式乘到 n 次,然后用初始的 \( h_0,...,h_{k-1} \) 来乘,在 bzoj 上似乎比上述方法稍微快一点。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=,mod=1e9+;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;} int n,k,a[N],h[N],b[N],c[N],ans[N];
void Mul(int *u,int *v)
{
memset(c,,sizeof c);
for(int i=;i<k;i++)
for(int j=;j<k;j++)
c[i+j]=(c[i+j]+(ll)u[i]*v[j])%mod;
for(int i=*(k-);i>=k;i--)
if(c[i])
for(int j=;j<=k;j++)
c[i-j]=(c[i-j]+(ll)c[i]*a[j])%mod;
memcpy(u,c,sizeof (int)*k);
}
int main()
{
n=rdn();k=rdn();
for(int i=;i<=k;i++)a[i]=upt(rdn());//upt!!!
for(int i=;i<k;i++)h[i]=upt(rdn());
if(n<k){printf("%d\n",h[n]);return ;}
/*for(int i=k,lm=2*(k-1);i<=lm;i++)
for(int j=1;j<=k;j++)
h[i]=(h[i]+(ll)a[j]*h[i-j])%mod;
if(n<=2*(k-1)){printf("%d\n",h[n]);return 0;}*/
b[]=; ans[]=;
/*n-=k-1;*/
while(n){ if(n&)Mul(ans,b); Mul(b,b); n>>=;}
int prn=;
/*for(int i=0;i<k;i++)
prn=(prn+(ll)h[k-1+i]*ans[i])%mod;*/
for(int i=;i<k;i++)
prn=(prn+(ll)h[i]*ans[i])%mod;
printf("%d\n",prn);
return ;
}
bzoj 4161 Shlw loves matrixI——常系数线性齐次递推的更多相关文章
- bzoj 4161: Shlw loves matrixI
Description 给定数列 {hn}前k项,其后每一项满足 hn = a1h(n-1) + a2h(n-2) + ... + ak*h(n-k) 其中 a1,a2...ak 为给定数列.请计算 ...
- bzoj 4161 Shlw loves matrixI【常系数线性齐次递推】
并不会递推,不过板子挺好背的,只要是类似的递推都能用,但是注意c数组不能使负数 如果除了递推还有常数项的话,就用f[i]-f[i-1]的方式消掉常数项(然后多一个f[i-1]的项) #include& ...
- BZOJ 4161 Shlw loves matrixI ——特征多项式
矩阵乘法递推的新姿势. 叉姐论文里有讲到 利用特征多项式进行递推,然后可以做到k^2logn #include <cstdio> #include <cstring> #inc ...
- LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推
题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...
- 模板-->常系数线性齐次递推(矩阵快速幂)
如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 Matrix模板 poj_2118_Firepersons,my_ac_code 简单的测试 None 代码模板 /* * ...
- 【Learning】常系数线性齐次递推
给定数列前k项\(h_0...h_{k-1}\),其后的项满足:\(h_i=\sum_{i=1}^kh_{i-j}a_i\),其中\(a_1...a_k\)是给定的系数,求\(h_n\) 数据范围小的 ...
- bzoj4161: Shlw loves matrixI
Description 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1,a2...ak 为给定数列.请计 ...
- 【BZOJ4161】Shlw loves matrixI (常系数齐次线性递推)
[BZOJ4161]Shlw loves matrixI (常系数齐次线性递推) 题面 BZOJ 题解 \(k\)很小,可以直接暴力多项式乘法和取模. 然后就是常系数齐次线性递推那套理论了,戳这里 # ...
- 【BZOJ4161】Shlw loves matrixI
题目描述 给定数列 {hn}前k项,其后每一项满足 hn = a1h(n-1) + a2h(n-2) + ... + ak*h(n-k) 其中 a1,a2...ak 为给定数列.请计算 h(n),并将 ...
随机推荐
- Gitlab仓库搭建和免密使用gitlab
Gitlab简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 可通过Web界面进行访问公开的或者私人项目.它拥有与Github类似的 ...
- Java 语言的类、属性、方法各有哪些修饰符?简述各修饰符的区别
1. 类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1.公共类修饰符 pub ...
- JSP基础--EL表达式
EL(表达式语言) 1 EL概述 1.1 EL的作用 JSP2.0要把html和css分离.要把html和javascript分离.要把Java脚本替换成标签.标签的好处是非Java人员都可以使用. ...
- mysql 数据库表结构对比语句
判断两个数据库互相不存在的表 select a.TABLE_SCHEMA,a.TABLE_NAME from information_schema.TABLES a where a.TABLE_SCH ...
- jq 与原生js 方法互相转换
最近在用mui写页面,当然了在移动App里引入jq或zepto这些框架,肯定是极不理性的.虽然jq很简单,但是也有兼容问题,js基础是很重要的,jq的成功当时是因为ie6.7.8.9.10.chrom ...
- [Linux] 008 文件处理命令
1. 文件处理命令:touch 命令名称:touch 命令所在路径:/bin/touch 执行权限:所有用户 语法:touch [文件名] 功能描述:创建空文件 范例: 文件名不包含空格 touch ...
- go 学习之io/ioutil包
// Discard 是一个 io.Writer 接口,调用它的 Write 方法将不做任何事情// 并且始终成功返回.var Discard io.Writer = devNull(0) // Re ...
- 如何为自己的网站添加HTTPS服务
如何为自己的网站添加HTTPS服务,针对单个域名而言的,下面介绍网站添加https方法,拿阿里云方法 1.准备证书文件 进入阿里云管理控制台-安全-证书服务点击购买证书服务,进入证书购买页面(放心,我 ...
- YouCompleteMe报错可能是第三方库没有
git submodule update --init --recursive 到YouCompleteMe安装目录下,执行上面的命令
- C++链接器
链接器把多个二进制的目标文件(object file)链接成一个单独的可执行文件 在链接过程中,它必须把符号(变量名.函数名等一些列标识符)用对应的数据的内存地址(变量地址.函数地址等)替代,以完成程 ...