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 ≤ ...
随机推荐
- SilverLight:基础控件使用(4)-日期显示和选择类控件
ylbtech-SilverLight-Basic-Control:基础控件使用(4)-日期显示和选择类控件 Calendar,DatePicker 1.A,返回顶部 Calendar控件(日期控件) ...
- Java中字符串转为16进制表示
Java中字符串转为16进制表示 String str = "鲸"; char[] chars = "0123456789ABCDEF".toCharArray ...
- cug oj 1479 Treasure Chest Lock (区间dp 思维)
1479: Treasure Chest Lock Time Limit: 1 Sec Memory Limit: 128 MB Submit: 7 Solved: 5 [id=1479" ...
- hihocoder 1032 manachar 求回文串O(n)
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- linux系列之-—04 自动删除n天前日志【转】
让Linux系统定时清理一些不需要的文件,日志很有必要 1. 删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; ...
- unix改变shell显示颜色
编写shell脚本的时候.通过改变shell的显示颜色,不但可以改变使用shell终端的体验,并且更为有用的是,可以通过改变显示内容的颜色来区分正常输出.warning和error等不同关注级别的输出 ...
- WPF03(样式)
说起样式,大家第一反应肯定是css,好的,先上一段代码. 1 html{border:0;} 2 ul,form{margin:0; padding:0} 3 body,div,th,td,li,dd ...
- LINUXFOUNDATION EVENTS
http://events.linuxfoundation.org/ #lflks This invitation-only event focuses on development and inno ...
- git mirror的创建与使用
please donwload repo mirro as follow steps, thanks 1.mirror server,server IP:192.168.0.123 1.1 -- de ...
- kubernetes对象之Volume
系列目录 概述 Volume是对各种存储资源的抽象.虚拟化.为管理.控制.使用存储资源提供统一接口.Openstack中的volume为虚拟机提供存储,Docker中的volume为容器提供存储.因为 ...