传送门

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

  1. //By Menteur_Hxy
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cstdlib>
  5. #include<iostream>
  6. #include<algorithm>
  7. #define F(i,a,b) for(register int i=(a);i<=(b);i++)
  8. using namespace std;
  9. typedef long long LL;
  10. LL read() {
  11. LL x=0,f=1; char c=getchar();
  12. while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
  13. while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
  14. return x*f;
  15. }
  16. const int K=20;
  17. int k;
  18. int c[K],b[K];
  19. LL n,m,MOD,ans1,ans2,s[K];
  20. struct Matrix{
  21. LL da[K][K];
  22. Matrix() {clear();};
  23. void clear() {memset(da,0,sizeof(da));}
  24. Matrix operator * (const Matrix oth) {
  25. Matrix res;
  26. F(i,0,k) F(j,0,k) F(l,0,k)
  27. res.da[i][j]=(res.da[i][j]+oth.da[i][l]*da[l][j]%MOD)%MOD;
  28. return res;
  29. }
  30. void print() {
  31. F(i,0,k) {
  32. F(j,0,k) cout<<da[i][j]<<" ";
  33. cout<<endl;
  34. }cout<<endl;
  35. }
  36. }ans,st;
  37. Matrix Qpow(Matrix a,LL d) {
  38. Matrix ret;
  39. ret.da[0][0]=s[k];
  40. F(i,1,k) ret.da[i][0]=b[k-i+1];
  41. while(d) {
  42. if(d&1) ret=ret*a;
  43. a=a*a; d>>=1;
  44. // a.print();
  45. }
  46. return ret;
  47. }
  48. int main() {
  49. k=read();
  50. F(i,1,k) b[i]=read(),s[i]=s[i-1]+b[i];
  51. F(i,1,k) c[i]=read();
  52. m=read(),n=read(),MOD=read();
  53. st.da[0][0]=1;
  54. F(i,1,k) st.da[0][i]=st.da[1][i]=c[i];
  55. F(i,2,k) st.da[i][i-1]=1;
  56. // st.print();
  57. if(n<=k) {
  58. printf("%lld",s[n]-s[m-1]);
  59. return 0;
  60. } else {
  61. ans=Qpow(st,n-k);
  62. // ans.print();
  63. ans1=ans.da[0][0];
  64. }
  65. if(m<=k) ans2=s[m-1];
  66. else {
  67. ans=Qpow(st,m-k-1);
  68. // ans.print();
  69. ans2=ans.da[0][0];
  70. }
  71. printf("%lld",(ans1-ans2+MOD)%MOD);
  72. return 0;
  73. }

[luogu2461 SDOI2008] 递归数列 (矩阵乘法)的更多相关文章

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

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

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

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

  3. 【bzoj3231】[Sdoi2008]递归数列 矩阵乘法+快速幂

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

  4. P2461 [SDOI2008]递归数列 矩阵乘法+构造

    还好$QwQ$ 思路:矩阵快速幂 提交:1次 题解: 如图: 注意$n,m$如果小于$k$就不要快速幂了,直接算就行... #include<cstdio> #include<ios ...

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

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

  6. bzoj 3231 [ Sdoi 2008 ] 递归数列 —— 矩阵乘法

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3231 裸矩阵乘法. 代码如下: #include<iostream> #incl ...

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

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

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

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

  9. BZOJ-3231 递归数列 矩阵连乘+快速幂

    题不是很难,但是啊,人很傻啊...机子也很鬼畜啊... 3231: [Sdoi2008]递归数列 Time Limit: 1 Sec Memory Limit: 256 MB Submit: 569 ...

随机推荐

  1. JCE, Java Cryptography Extension

    JCE, Java Cryptography Extension Java 8 JCE下载地址: http://www.oracle.com/technetwork/java/javase/downl ...

  2. Graphics简单汇总

    1.主页面布局文件 activity_main.xml(仅仅有2个button按钮) <?xml version="1.0" encoding="utf-8&quo ...

  3. joinColumns和inverseJoinColumns的使用方法

    近期在工作中使用springside.里面用到了hibernate的多对多 一開始我在配置department(部门表)和menu(栏目表)的时候.这样写的. Department实体类中的getMe ...

  4. Swift开发教程--怎样清除模拟器的数据

    打开xcode->preference->location->derived Data,进入文件夹下,删除里面所以后的文件夹就能够了.

  5. git 的安装和使用

    安装Git 下载并安装 mysysgit 下载并安装 git windows版本号 配置Git 设置你的名字和邮箱 git config --global user.name "xxxx&q ...

  6. [RK3288][Android6.0] 调试笔记 --- 普通串口的添加 【转】

    本文转载自:http://blog.csdn.net/kris_fei/article/details/54574073   标签: rk3288 串口添加 2017-01-16 14:52 1079 ...

  7. 利用html sessionStorge 来保存局部页面在刷新后回显,保留

    转自:https://blog.csdn.net/u011085172/article/details/77320562 在一个页面里面,有个局部页面记录这当前session的任务记录,之前用的coo ...

  8. fsockopen get,post 封装 (转)

    function http_request($url, $method = 'GET', $postfields = NULL, $headers = array()) {   $parse = pa ...

  9. Elasticsearch 7.1.1 集群 + 配置身份验证

    一.安装Elasticsearch 1.1 环境说明 Centos7.6 Elasticsearch7.1.1 #挂载数据盘 fdisk /dev/vdb n,p,,回车,回车,wq fdisk -l ...

  10. php 图片生成器

    一.需求 最近公司由于有大量的海报要做,而且海报的布局规模都是一样的,只是内容不同,所以老板想我开发一个图片的生成器.可以根据你输入的内容生成海报图片. 具体有需求有以下的需求 1.可以根据将每条数据 ...