题解:

矩阵乘法,在矩阵中构造当前前缀和;

注意:for(int/long long ;;);

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long Lint; Lint n,m;
int k,p;
int b[200];
int c[200];
Lint tmp1,tmp2;
Lint sum;
int minit(){
tmp1=tmp2=sum=0;
} struct Matrix{
Lint e[200][200];
Matrix(){
memset(e,0,sizeof(e));
}
int clear(){
memset(e,0,sizeof(e));
}
}t,x,y,z,ret; int Mul(){
z.clear();
for(int i=0;i<=k;++i){
for(int j=0;j<=k;++j){
for(int r=0;r<=k;++r){
z.e[i][j]=(z.e[i][j]+x.e[i][r]*y.e[r][j])%p;
}
}
}
} int Ksm(Lint p){
ret.clear();
for(int i=0;i<=k;++i)ret.e[i][i]=1;
while(p){
if(p<0)return 0;
if(p&1){
x=ret;y=t;Mul();
ret=z;
}
p>>=1;
x=t;y=t;Mul();
t=z;
}
} int main(){
minit(); scanf("%d",&k);
for(int i=1;i<=k;++i)scanf("%d",&b[i]);
for(int i=1;i<=k;++i)scanf("%d",&c[i]);
scanf("%lld%lld%d",&n,&m,&p);
for(int i=1;i<=k;++i)sum=(sum+b[i])%p; if(m<=k){
for(int i=n;i<=m;++i)tmp1=(tmp1+b[i])%p;
printf("%lld\n",tmp1);
return 0;
}else{ for(Lint i=n;i<=k;++i)tmp2=(tmp2+b[i])%p;
n=max(n,k+1LL); for(int i=1;i<=k;++i)t.e[1][i]=t.e[0][i]=c[i];
for(int i=2;i<=k;++i)t.e[i][i-1]=1;
t.e[0][0]=1;
Ksm(n-k-1); for(int i=1;i<=k;++i){
tmp1=(tmp1+ret.e[0][i]*b[k-i+1])%p;
}
tmp1=(tmp1+sum*ret.e[0][0])%p; t.clear();
for(int i=1;i<=k;++i)t.e[1][i]=t.e[0][i]=c[i];
for(int i=2;i<=k;++i)t.e[i][i-1]=1;
t.e[0][0]=1;
Ksm(m-k); for(int i=1;i<=k;++i)tmp2=(tmp2+ret.e[0][i]*b[k-i+1]%p)%p;
tmp2=(tmp2+sum*ret.e[0][0])%p; printf("%lld\n",(tmp2-tmp1+p)%p);
return 0;
}
}

  

BZOJ:3231: [Sdoi2008]递归数列的更多相关文章

  1. BZOJ 3231: [Sdoi2008]递归数列( 矩阵快速幂 )

    矩阵乘法裸题..差分一下然后用矩阵乘法+快速幂就可以了. ----------------------------------------------------------------------- ...

  2. BZOJ 3231: [Sdoi2008]递归数列 (JZYZOJ 1353) 矩阵快速幂

    http://www.lydsy.com/JudgeOnline/problem.php?id=3231   和斐波那契一个道理在最后加一个求和即可 #include<cstdio> #i ...

  3. bzoj 3231 [Sdoi2008]递归数列——矩阵乘法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 矩阵乘法裸题. 1018是10^18.别忘了开long long. #include& ...

  4. bzoj 3231: [Sdoi2008]递归数列【矩阵乘法】

    今天真是莫名石乐志 一眼矩阵乘法,但是这个矩阵的建立还是挺有意思的,就是把sum再开一列,建成大概这样 然后记!得!开!long!long!! #include<iostream> #in ...

  5. BZOJ3231: [Sdoi2008]递归数列

    BZOJ3231: [Sdoi2008]递归数列 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + ...

  6. BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法

    BZOJ_3231_[Sdoi2008]递归数列_矩阵乘法 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1a ...

  7. 开始玩矩阵了!先来一道入门题![SDOI2008]递归数列

    [SDOI2008]递归数列 题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + c ...

  8. P2461 [SDOI2008]递归数列

    题目描述 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj 和 cj ...

  9. [bzoj3231][SDOI2008]递归数列——矩阵乘法

    题目大意: 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k 其中bj和 cj ...

随机推荐

  1. Day2-I-Knight's Problem POJ - 3985

    You must have heard of the Knight's Tour problem. In that problem, a knight is placed on an empty ch ...

  2. 5.6 Nginx Rewrite模块配置

  3. 请求http协议分析- (mysql-thinkphp) (5)

    http协议 https://tools.ietf.org/pdf/rfc7231.pdf https://www.w3.org/Protocols/ ======================== ...

  4. MongoDB安装+基础操作

    MongoDB 一. 安装 这里展示使用docker安装mongoDB 拉取最新MongoDB镜像 docker pull mongo 运行容器 docker run -itd --name mong ...

  5. nohup command 2>&1 & 的含义

    nohup command 2>&1 &的含义: nohup:no hang up,意思是不挂断.表示永久执行命令,哪怕当前终端已经退出登录. 并且命令前面添加nohup之后,会 ...

  6. Fiddler抓取HTTP请求。

    参考链接:http://blog.csdn.net/ohmygirl/article/details/17849983/ http://www.cnblogs.com/kingwolf_JavaScr ...

  7. java随记 2月16

    1.a=a+b 等于 a+=b ,且a+=b隐含强制类型转换 2.^ 表示异或   两个二进制同号为假,异号为真    即 0^0=0,1^1=0,0^1=1 3.三元运算    布尔表达式 ?表达式 ...

  8. 10. Regular Expression Matching正则表达式匹配

    Implement regular expression matching with support for '.' and '*'. '.' Matches any single character ...

  9. Vulkan SDK Demo 之一 熟悉

    DiligentEngine的API是D3d11和D3D12风格的,vulkan也被封装成了这种风格的API. 在了解Diligent Engine是如何对vulkan进行封装之前,我准备先学习下Vu ...

  10. php导出合同模板到excel

    /** * [export_excel 合同导出] * [@param itemid:单号] * @return [type] */ public function export_excel() { ...