[SDOI2008]递归数列

题目描述

一个由自然数组成的数列按下式定义:

对于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的余数的值。

输入输出格式

输入格式:

输入文件spp.in由四行组成。

第一行是一个自然数k。

第二行包含k个自然数b1, b2,...,bk。

第三行包含k个自然数c1, c2,...,ck。

第四行包含三个自然数m, n, p。


输出格式:

输出文件spp.out仅包含一行:一个正整数,表示(am + am+1 + am+2 + ... + an) mod p的值。

输入输出样例

输入样例#1:

  1. 2
  2. 1 1
  3. 1 1
  4. 2 10 1000003
输出样例#1:

  1. 142

说明

对于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

挺水的一道题,推出了矩阵,然后前缀和搞搞也就简单了;

矩阵如下:

S[n]
b[n]
b[n-1]
...
b[n-k+1]

=

1 c[1] ... c[k-1] c[k]
0 c[1] ... c[k-1] c[k]
0 1 ... 0 0
0 0 ... 0 0
0 0 ... 1 0

*

S[n-1]
b[n-1]
b[n-2]
...
b[n-k+1]
  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define maxn 20
  4. using namespace std;
  5.  
  6. ll k,b[maxn],c[maxn],n,m,p,tot;
  7.  
  8. struct mat{
  9. ll x,y;
  10. ll s[maxn][maxn];
  11. };
  12.  
  13. mat operator *(mat a,mat b)
  14. {
  15. mat c;
  16. c.x = a.x;
  17. c.y = b.y;
  18. memset(c.s,,sizeof(c.s));
  19. for(ll i=;i<=a.x;i++)
  20. for(ll j=;j<=b.y;j++)
  21. for(ll k=;k<=b.x;k++)
  22. c.s[i][j] = (c.s[i][j] + a.s[i][k] * b.s[k][j] % p) % p;
  23. return c;
  24. }
  25.  
  26. mat ksm(mat a,ll ci)
  27. {
  28. mat ans;
  29. memset(ans.s,,sizeof(ans.s));
  30. ans.x = ans.y = a.x;
  31. for(ll i=;i<=ans.x;i++)
  32. ans.s[i][i] = ;
  33. while(ci)
  34. {
  35. if(ci & ) ans = ans * a;
  36. a = a * a;
  37. ci >>= ;
  38. }
  39. return ans;
  40. }
  41.  
  42. ll find(ll num)
  43. {
  44. if(num <= k)
  45. {
  46. ll ans = ;
  47. for(ll i=;i<=num;i++) ans += b[i],ans %= p;
  48. return ans % p;
  49. }
  50. mat ans;
  51. memset(ans.s,,sizeof(ans.s));
  52. ans.x = ans.y = k + ;
  53. for(ll i=;i<=k+;i++)
  54. ans.s[][i] = ans.s[][i] = c[i - ];
  55. ans.s[][] = ;
  56. for(ll i=;i<=k;i++)
  57. ans.s[i + ][i] = ;
  58. ans = ksm(ans , num - k);
  59. mat right;
  60. memset(right.s,,sizeof(right.s));
  61. right.x = k + ;
  62. right.y = ;
  63. for(ll i=;i<=k+;i++)
  64. right.s[i][] = b[k + - i];
  65. right.s[][] = tot;
  66. right = ans * right;
  67. return right.s[][];
  68. }
  69.  
  70. int main(){
  71. cin >> k;
  72. for(ll i=;i<=k;i++) scanf("%d",&b[i]),tot += b[i];
  73. for(ll i=;i<=k;i++) scanf("%d",&c[i]);
  74. cin >> m >> n >> p;
  75. cout << (find(n) - find(m - ) + p) % p;
  76. }

开始玩矩阵了!先来一道入门题![SDOI2008]递归数列的更多相关文章

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

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

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

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

  3. 可恶!学了这么久的LCA,联考的题目却是LCA+树形DP!!!可恶|!!!这几天想学学树形DP吧!先来一道入门题HDU 1520 Anniversary party

    题目描述 某大学有N个职员,编号为1~N.他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri, ...

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

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

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

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

  6. [luoguP2461] [SDOI2008]递归数列(DP + 矩阵优化)

    传送门 本题主要是构造矩阵,我们只需要把那一段式子看成两个前缀和相减, 然后就直接矩阵连乘. 直接对那个k+1阶矩阵快速幂即可,注意初始化矩阵为单位矩阵,即主对角线(左上到右下)都为1其他都为0. 另 ...

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

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

  8. [luogu2461 SDOI2008] 递归数列 (矩阵乘法)

    传送门 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai- ...

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

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

随机推荐

  1. 获取win10壁纸

    执行命令会将所有壁纸拷贝到桌面上的wallpaper文件夹内 bat xcopy %LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryMa ...

  2. mysql源码包安装

    一.准备编译环境 # yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake # wget ht ...

  3. 数据库之DML

    1.表的有关操作: 1.1.表的创建格式: CREATE TABLE IF NOT EXISTS 表名(属性1 类型,属性2 类型,....,属性n 类型):# 标记部分表示可以省略 1.2.表的修改 ...

  4. Python示例-Logging

    logging.ini日志配置文件内容示例: [loggers] keys=root,demo [handlers] keys=consoleHandler,timedRotatingFileHand ...

  5. JavaScript Return Object.Type

    var getType = function(obj) { if (obj == null) { return String(obj); } return typeof obj === 'object ...

  6. Linux下安装tomcat与配置

    准备工作:将下载好的tomcat 9.0上传到自己的阿里云服务器(推荐根目录下) 附下载地址:https://archive.apache.org/dist/tomcat/tomcat-9/v9.0. ...

  7. 区间gcd

    http://codeforces.com/problemset/problem/914/D 题意:给你n个数,两种操作:1.询问区间[l,r]在至多一次修改一个数的条件下区间gcd是否等于x. 2. ...

  8. 最少多少人说谎(dp)

    https://ac.nowcoder.com/acm/contest/1168/H 题意:n个学生,邓志聪想知道这些学生的考试情况,于是一个一个叫这些学生叫去办公室问他们,但是有些学生并没有讲真话, ...

  9. Nginx工作机制

    Nginx分为单工作进程和多工作进程两种模式.通常采用1个master+多个worker进程配合异步非阻塞的工作机制.master进程主要负责管理自身和下属的worker进程,worker负责处理请求 ...

  10. 列表、元组和range

    小知识点 s = " 5 " print(int(s)) print(s.replace(" ","")) 结果: 5 5 id()#获取对 ...