[luogu2461 SDOI2008] 递归数列 (矩阵乘法)
Description
一个由自然数组成的数列按下式定义:
对于i <= k:ai = bi
对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k
其中bj 和 cj (1<=j<=k)是给定的自然数。写一个程序,给定自然数m <= n, 计算am + am+1 + am+2 + ... + an, 并输出它除以给定自然数p的余数的值。
Input
输入文件spp.in由四行组成。
第一行是一个自然数k。
第二行包含k个自然数b1, b2,...,bk。
第三行包含k个自然数c1, c2,...,ck。
第四行包含三个自然数m, n, p。
Output
输出文件spp.out仅包含一行:一个正整数,表示(am + am+1 + am+2 + ... + an) mod p的值。
Sample Input
2
1 1
1 1
2 10 1000003
Sample Output
142
HINT
对于100%的测试数据:
1<= k <=15
1 <= m <= n <= 1018
对于20%的测试数据:
1<= k <=15
1 <= m <= n <= 106
对于30%的测试数据:
k=1 1 <= m <= n <= 1018
对于所有测试数据:
0<= b1, b2,... bk, c1, c2,..., ck<=109
1 <= p <= 108
Solution
构造矩阵然后直接乘
注意乘的顺序还有最后一定要再MOD一次以防万一qwq
Code
//By Menteur_Hxy
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
using namespace std;
typedef long long LL;
LL read() {
LL x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int K=20;
int k;
int c[K],b[K];
LL n,m,MOD,ans1,ans2,s[K];
struct Matrix{
LL da[K][K];
Matrix() {clear();};
void clear() {memset(da,0,sizeof(da));}
Matrix operator * (const Matrix oth) {
Matrix res;
F(i,0,k) F(j,0,k) F(l,0,k)
res.da[i][j]=(res.da[i][j]+oth.da[i][l]*da[l][j]%MOD)%MOD;
return res;
}
void print() {
F(i,0,k) {
F(j,0,k) cout<<da[i][j]<<" ";
cout<<endl;
}cout<<endl;
}
}ans,st;
Matrix Qpow(Matrix a,LL d) {
Matrix ret;
ret.da[0][0]=s[k];
F(i,1,k) ret.da[i][0]=b[k-i+1];
while(d) {
if(d&1) ret=ret*a;
a=a*a; d>>=1;
// a.print();
}
return ret;
}
int main() {
k=read();
F(i,1,k) b[i]=read(),s[i]=s[i-1]+b[i];
F(i,1,k) c[i]=read();
m=read(),n=read(),MOD=read();
st.da[0][0]=1;
F(i,1,k) st.da[0][i]=st.da[1][i]=c[i];
F(i,2,k) st.da[i][i-1]=1;
// st.print();
if(n<=k) {
printf("%lld",s[n]-s[m-1]);
return 0;
} else {
ans=Qpow(st,n-k);
// ans.print();
ans1=ans.da[0][0];
}
if(m<=k) ans2=s[m-1];
else {
ans=Qpow(st,m-k-1);
// ans.print();
ans2=ans.da[0][0];
}
printf("%lld",(ans1-ans2+MOD)%MOD);
return 0;
}
[luogu2461 SDOI2008] 递归数列 (矩阵乘法)的更多相关文章
- bzoj 3231 [Sdoi2008]递归数列——矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...
- [bzoj3231][SDOI2008]递归数列——矩阵乘法
题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂
题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...
- P2461 [SDOI2008]递归数列 矩阵乘法+构造
还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...
- BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...
- bzoj 3231 [ Sdoi 2008 ] 递归数列 —— 矩阵乘法
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 裸矩阵乘法. 代码如下: #include<iostream> #incl ...
- BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...
- 开始玩矩阵了!先来一道入门题![SDOI2008]递归数列
[SDOI2008]递归数列 题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + c ...
- BZOJ-3231 递归数列 矩阵连乘+快速幂
题不是很难,但是啊,人很傻啊...机子也很鬼畜啊... 3231: [Sdoi2008]递归数列 Time Limit: 1 Sec Memory Limit: 256 MB Submit: 569 ...
随机推荐
- [RxJS] exhaustMap vs switchMap vs concatMap
exhaustMap: It drop the outter observable, just return the inner observable, and it waits until prev ...
- Rust 中项目构建管理工具 Cargo简单介绍
cargo是Rust内置的项目管理工具.用于Rust 项目的创建.编译.执行,同一时候对项目的依赖进行管理,自己主动推断使用的第三方依赖库,进行下载和版本号升级. 一.查看 cargo 版本号 安装R ...
- axis实现webservices分布式通信
分布式通信原理 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2ZsMjAxMjEzMTQ=/font/5a6L5L2T/fontsize/400/fil ...
- luogu2161 [SHOI2009]会场预约
题目大意 随着时间的推移这里有几个任务对应着一段区间.每次要将任务安到时间线上时,要把时间线上已有的与该任务对应区间有交集的区间对应的任务删去.求每次删去的区间个数,以及整个时间线上有几个任务.时间线 ...
- 粗结MySql数据库基础知识点之一
首先弄什么是数据库? 数据库就是用来存储和管理数据的仓库. 数据库存储数据的优点: 1.可存储大量的数据 2.方便检索 3.保持数据的一致性,完整性 4.安全 可共享 5.通过组合分析,可以产 ...
- oc38--类工厂方法在继承中
// Person.h #import <Foundation/Foundation.h> @interface Person : NSObject @property int age; ...
- codevs2596 售货员的难题(状压dp)
2596 售货员的难题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 某乡有n个村庄(1<n<=15 ...
- javaweb 课程设计编码和设计文档
企业办公软件设计文档 1引言 1.1编写目的 OA办公自动化系统详细设计是设计的第三个阶段,这个阶段的主要任务是在OA办公自动化系统概要设计书基础上,对概要设计中产生的功能模块进行过程描述,设计功能模 ...
- 画板(适用于手机、PC端)
Html代码 <script type="text/javascript" src="jquery-1.9.1.min.js"></scrip ...
- ruby --Paperclip::NotIdentifiedByImageMagickError
首先,如果遇到这个问题,Paperclip::NotIdentifiedByImageMagickError,先检查下环境变量是否配置了ImagicMagick的路径. cmd下path 查看,首先加 ...