BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法
Description
Input
Output
Sample Input
1 1
1 1
2 10 1000003
Sample Output
HINT
对于100%的测试数据:
1<= k<=15
1 <= m <= n <= 1018
用c矩阵做矩阵乘法。
由于需要求和我们在矩阵中加一项表示Sn。
然后直接上矩阵快速幂。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define N 20
ll p,c[N],a[N],b[N],s[N];
int n,m;
struct Mat {
ll v[N][N];
Mat() {memset(v,0,sizeof(v));}
Mat operator * (const Mat &x) const {
Mat re; int i,j,k;
for(i=1;i<=m;i++) {
for(j=1;j<=m;j++) {
for(k=1;k<=m;k++) {
re.v[i][j]=(re.v[i][j]+v[i][k]*x.v[k][j])%p;
}
}
}
return re;
}
}X;
Mat qp(Mat x,ll y) {
Mat I;
int i;
for(i=1;i<=m;i++) I.v[i][i]=1;
for(;y;y>>=1ll,x=x*x) if(y&1ll) I=I*x;
return I;
}
ll getS(ll y) {
if(y<=n) return s[y];
Mat T=qp(X,y-n);
ll re=0;
int i;
for(i=1;i<=n;i++) re=(re+a[i]*T.v[m][i])%p;
re=(re+s[n]*T.v[m][m])%p;
return re;
}
int main() {
scanf("%d",&n);
int i;
ll l,r;
for(i=1;i<=n;i++) scanf("%lld",&b[i]);
for(i=1;i<=n;i++) scanf("%lld",&c[i]);
scanf("%lld%lld%lld",&l,&r,&p);
for(i=1;i<=n;i++) a[n-i+1]=b[i];
for(i=1;i<=n;i++) s[i]=s[i-1]+a[i];
for(i=1;i<=n;i++) X.v[1][i]=X.v[n+1][i]=c[i];
for(i=2;i<=n;i++) X.v[i][i-1]=1;
m=n+1;
X.v[m][m]=1;
// printf("%lld %lld\n",l,r);
// printf("%lld\n",getS(l-1));
printf("%lld\n",(getS(r)-getS(l-1)+p)%p);
}
BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法的更多相关文章
- bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】
今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...
- BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )
矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...
- 开始玩矩阵了!先来一道入门题![SDOI2008]递归数列
[SDOI2008]递归数列 题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + c ...
- BZOJ3231: [Sdoi2008]递归数列
BZOJ3231: [Sdoi2008]递归数列 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + ...
- BZOJ_5118_Fib数列2_矩阵乘法+欧拉定理
BZOJ_5118_Fib数列2_矩阵乘法+欧拉定理 Description Fib定义为Fib(0)=0,Fib(1)=1,对于n≥2,Fib(n)=Fib(n-1)+Fib(n-2) 现给出N,求 ...
- B20J_1297_[SCOI2009]迷路_矩阵乘法
B20J_1297_[SCOI2009]迷路_矩阵乘法 题意:有向图 N 个节点,从节点 0 出发,必须恰好在 T 时刻到达节点 N-1.总共有多少种不同的路径? 2 <= N <= 10 ...
- BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法
BZOJ_1875_[SDOI2009]HH去散步_矩阵乘法 Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但 是同时H ...
- BZOJ_5015_[Snoi2017]礼物_矩阵乘法
BZOJ_5015_[Snoi2017]礼物_矩阵乘法 Description 热情好客的请森林中的朋友们吃饭,他的朋友被编号为 1-N,每个到来的朋友都会带给他一些礼物:.其中,第 一个朋友会带给他 ...
- BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法
BZOJ_4870_[Shoi2017]组合数问题_矩阵乘法 Description Input 第一行有四个整数 n, p, k, r,所有整数含义见问题描述. 1 ≤ n ≤ 10^9, 0 ≤ ...
随机推荐
- Zxing二维码精简(竖屏、拉伸处理、扫描框大小和扫描线移动)
本帖最后由 levil_ad 于 2013-12-30 13:55 编辑 最近没事做了下二维码扫描,用的是ZXing的开源代码,官方源码地址:http://code.google.com/p/zxin ...
- vue-router 的URL路径中#的意义
传送门 https://router.vuejs.org/zh-c... Router 构造配置 routes 类型: Array<RouteConfig> RouteConfig 的类型 ...
- 【matlab】:matlab中不断的出现计算过程怎么办
这个问题是会常常性出的.就是matlab中不断的出现计算. 关于这个问题,我们须要考虑的是自己是不是写错了,通常会出现以下两种可能的错误 1,关于计算的函数没有写分号 :这样的是致命问题,假设函数不写 ...
- Odoo HRMS应用简介
Odoo HRMS包含行政管理的大部分功能,包含 部门组织架构 员工清册 岗位规划以及招聘管理 用工合同 考勤管理 休假和加班 费用报销 员工考核 绩效.激励.培训成绩 薪资清册 个角色 角色 ...
- VM(转)
vmplayer && VMworkstation 很多人想尝试一下多种不同的操作系统,例如学习Linux:又或者希望搞一个专门的系统用来测试各种各样东西而不会搞乱搞坏现有的系统. ...
- UVA 10042 Smith Numbers(数论)
Smith Numbers Background While skimming his phone directory in 1982, Albert Wilansky, a mathematicia ...
- 基于bootstrap+MySQL搭建动态网站
这个只是在上个练习项目中的后台管理项目加入了MySQL,数据不是写死的,而是从数据库中获取到的,获取到数据执行增删改查操作,没什么 计数难度,不做介绍
- Activiti实战
说实话,接触Activiti已经是3年前的事情,那时候组里想做一个流程自动化的application,并且记录用户点击.做单量等.第一次听说Activiti,感觉挺好奇的,遂看了下相关的文档跟同事的代 ...
- PHP网站加网站访问量统计
新建cnt.php <?php $n=file_get_contents('cnt.txt'); $n++; file_put_contents('cnt.txt',$n); echo &quo ...
- SVN经常使用命令总结(持续更新)
如今流行的协同管理工具预计就属SVN和Git了.这两者都使用过,只是如今正在使用的是SVN.故将常常使用的命令总结下来. 无论是Windows端的svnclient还是eclipse的subversi ...