题目:3231: [Sdoi2008]递归数列

题意:

一个由自然数组成的数列按下式定义:
 
对于i <= k:ai = bi
对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai-k
其中bjcj1<=j<=k)是给定的自然数。写一个程序,给定自然数m <= n, 计算am + am+1 + am+2 + ... + an, 并输出它除以给定自然数p的余数的值。 1<= k<=15,1 <= m <= n <= 10^18
本题主要是构造矩阵,然后就直接矩阵连乘即可。
 
构造的上述矩阵的i大于k,当i小于k时就直接加起来就行。
 
这样am + am+1 + am+2 + ... + an=S(n)-S(m-1)
 
代码:
  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdio.h>
  4.  
  5. using namespace std;
  6. typedef long long LL;
  7. const int MAXN=25;
  8.  
  9. struct Matrix
  10. {
  11. LL m[MAXN][MAXN];
  12. };
  13.  
  14. LL b[MAXN],c[MAXN];
  15. LL K,M,N,P;
  16. Matrix a,per;
  17.  
  18. void Init()
  19. {
  20. int i,j;
  21. for(i=0;i<=K;i++)
  22. for(j=0;j<=K;j++)
  23. per.m[i][j]=(i==j);
  24. }
  25.  
  26. Matrix multi(Matrix a,Matrix b)
  27. {
  28. Matrix c;
  29. int i,j,k;
  30. for(i=0;i<=K;i++)
  31. {
  32. for(j=0;j<=K;j++)
  33. {
  34. c.m[i][j]=0;
  35. for(k=0;k<=K;k++)
  36. c.m[i][j]+=a.m[i][k]*b.m[k][j]%P;
  37. c.m[i][j]%=P;
  38. }
  39. }
  40. return c;
  41. }
  42.  
  43. Matrix matrix_mod(LL n)
  44. {
  45. Matrix ans=per,p=a;
  46. while(n)
  47. {
  48. if(n&1)
  49. {
  50. ans=multi(ans,p);
  51. n--;
  52. }
  53. n>>=1;
  54. p=multi(p,p);
  55. }
  56. return ans;
  57. }
  58.  
  59. int main()
  60. {
  61. int i,j;
  62. Init();
  63. LL ret1,ret2,S;
  64. Matrix ans;
  65. while(cin>>K)
  66. {
  67. ret1=ret2=0;
  68. for(i=0;i<K;i++)
  69. cin>>b[i];
  70. for(i=0;i<K;i++)
  71. cin>>c[i];
  72. cin>>M>>N>>P;
  73. for(i=0;i<K;i++)
  74. {
  75. b[i]%=P;
  76. c[i]%=P;
  77. }
  78. for(i=0;i<=K;i++)
  79. {
  80. for(j=0;j<=K;j++)
  81. {
  82. a.m[i][j]=0;
  83. if(i==0&&j==0) a.m[i][j]=1;
  84. if(i==0&&j>0) a.m[i][j]=c[j-1];
  85. if(i==1&&j>0) a.m[i][j]=c[j-1];
  86. if(i>1) a.m[i][j]=(i==(j+1));
  87. }
  88. }
  89. S=0;
  90. for(i=0;i<K;i++)
  91. {
  92. S+=b[i];
  93. S%=P;
  94. }
  95. if(N<=K)
  96. {
  97. for(i=0;i<=N-1;i++)
  98. {
  99. ret1+=b[i];
  100. ret1%=P;
  101. }
  102. }
  103. else
  104. {
  105. ans=matrix_mod(N-K);
  106. ret1=ans.m[0][0]*S%P;
  107. for(i=1;i<=K;i++)
  108. {
  109. ret1+=ans.m[0][i]*b[K-i]%P;
  110. ret1%=P;
  111. }
  112. }
  113. if(M-1<=K)
  114. {
  115. if(M>=2)
  116. for(i=0;i<=M-2;i++)
  117. {
  118. ret2+=b[i];
  119. ret2%=P;
  120. }
  121. if(M<2) ret2=0;
  122. }
  123. else
  124. {
  125. ans=matrix_mod(M-K-1);
  126. ret2=ans.m[0][0]*S%P;
  127. for(i=1;i<=K;i++)
  128. {
  129. ret2+=ans.m[0][i]*b[K-i]%P;
  130. ret2%=P;
  131. }
  132. }
  133. cout<<((ret1-ret2)%P+P)%P<<endl;
  134. }
  135. return 0;
  136. }


 

BZOJ3231(矩阵连乘,稍有点复杂)的更多相关文章

  1. 如果你喜欢python,那你迟早会喜欢上julia的!

    你可曾想过有那么一门语言: 这门语言能够有C语言一样的速度,Ruby一样得活力(dynamism).像homoiconic一样的语言,它像Lisp一样有宏,但是也像Matlab一样有显而易见.熟悉的数 ...

  2. [2017BUAA软工助教]团队beta得分总表

    一.累计得分 项目 α例会 α发布 α测试 α展示 α事后 合计 满分 50 10 10 150 10 230 hotcode5 50 10 9 150 9 228 弗朗明哥舞步 50 10 8 13 ...

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

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

  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. 【BZOJ-3243】向量内积 随机化 + 矩阵

    3243: [Noi2013]向量内积 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1249  Solved:  ...

  7. (转)投影矩阵的推导(Deriving Projection Matrices)

    转自:http://blog.csdn.net/gggg_ggg/article/details/45969499 本文乃<投影矩阵的推导>译文,原文地址为: http://www.cod ...

  8. 用状态矩阵解决有序操作的case爆炸问题(转载)

    转自http://qa.baidu.com/blog/?p=167 作者:qabloger 一. 简介 我们在测试中可能都会面对case爆炸问题.有的case组合是无序的,我们可以通过pict[1]组 ...

  9. OpenCL 矩阵乘法

    ▶ 矩阵乘法,按照书里的内容进行了几方面的优化,包括局部内存,矢量数据类型,寄存器,流水线等. ● 最直接的乘法.调用时 main.c 中使用 size_t globalSize[] = { rowA ...

随机推荐

  1. Unity3D移植到自己的Android程序

    用Unity3D开发需要把动画效果移植到现有的APP上面.Unity for Android 比较特殊,Unity for IOS 打包是将XCODE工程直接交给开发者,开发者可以在工程的基础上继续添 ...

  2. css3图片3D翻转效果

    点击图片看翻转效果 html结构 <div class="flip"> <div class="front"> <img src= ...

  3. KNN算法[分类算法]

    kNN(k-近邻)分类算法的实现 (1) 简介: (2)算法描述: (3) <?php /* *KNN K-近邻方法(分类算法的实现) */ /* *把.txt中的内容读到数组中保存,$file ...

  4. Docker和DevOps是找工作必备技能

    根据最近的IT Jobs Watch数据,涉及Docker技术的的工作角色上升了317名次,排在500个最受追捧的IT技能第二位.无独有偶,从Rackspace最近的研究表明,Docker和DevOp ...

  5. java 键盘输入多种方法 .(转载)

    一.java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner. 实例程序: 1.利用 Scanner 实现从键盘读入int ...

  6. liunx使用技巧

    1.挂载与卸载U盘 新建一个目录:mkdir /mnt/usb; Fdisk –l |less  查看添加之后的设备名,设备文件系统格式 加载U盘设备: mount –t vfat /mnt/usb ...

  7. MySQL 关闭子表的外键约束检察

    准备: 定义一个教师表.一个学生表:在学生表中引用教师表ID create table teachers(teacherID int not null auto_increment primary k ...

  8. Qt全屏显示窗口、子窗口的相关函数

    Qt全屏显示函数         window.showFullScreen() Qt最大化显示函数         window.showMaximized() Qt最小化显示函数         ...

  9. C功底挑战Java菜鸟入门概念干货(一)

    一.认识Java 1.Java 程序比较特殊,它必须先经过编译,然后再利用解释的方式来运行.  2.Byte-codes 最大的好处是——可越平台运行,可让“一次编写,处处运行”成为可能.  3.使用 ...

  10. USACO chapter1

    几天时间就把USACO chapter1重新做了一遍,发现了自己以前许多的不足.蒽,现在的程序明显比以前干净很多,而且效率也提高了许多.继续努力吧,好好的提高自己.这一章主要还是基本功的训练,没多少的 ...