传送门

本题主要是构造矩阵,我们只需要把那一段式子看成两个前缀和相减, 然后就直接矩阵连乘。

直接对那个k+1阶矩阵快速幂即可,注意初始化矩阵为单位矩阵,即主对角线(左上到右下)都为1其他都为0。

另外,很多量要开long long。

  1. #include <cstdio>
  2. #include <cstring>
  3. #define LL long long
  4.  
  5. int k;
  6. LL b[21], c[21], n, m, p;
  7.  
  8. struct Matrix
  9. {
  10. int n, m;
  11. LL a[21][21];
  12. Matrix()
  13. {
  14. n = m = 0;
  15. memset(a, 0, sizeof(a));
  16. }
  17. }sum, sum1, sum2, t;
  18.  
  19. inline Matrix operator * (Matrix x, Matrix y)
  20. {
  21. int i, j, k;
  22. Matrix ans;
  23. ans.n = x.n;
  24. ans.m = y.m;
  25. for(i = 1; i <= x.n; i++)
  26. for(j = 1; j <= y.m; j++)
  27. for(k = 1; k <= y.n; k++)
  28. ans.a[i][j] = (ans.a[i][j] + x.a[i][k] * y.a[k][j]) % p;
  29. return ans;
  30. }
  31.  
  32. inline Matrix operator ^ (Matrix x, LL y)
  33. {
  34. int i;
  35. Matrix ans;
  36. ans.n = ans.m = k + 1;
  37. for(i = 1; i <= k + 1; i++) ans.a[i][i] = 1;
  38. for(; y; y >>= 1)
  39. {
  40. if(y & 1) ans = ans * x;
  41. x = x * x;
  42. }
  43. return ans;
  44. }
  45.  
  46. int main()
  47. {
  48. int i;
  49. scanf("%d", &k);
  50. for(i = 1; i <= k; i++) scanf("%lld", &b[i]);
  51. for(i = 1; i <= k; i++) scanf("%lld", &c[i]);
  52. scanf("%lld %lld %lld", &m, &n, &p);
  53. for(i = 1; i <= k; i++) b[i] %= p, c[i] %= p;
  54. sum.n = sum.m = k + 1;
  55. sum.a[1][1] = 1;
  56. for(i = 3; i <= k + 1; i++) sum.a[i][i - 1] = 1;
  57. for(i = 2; i <= k + 1; i++) sum.a[1][i] = sum.a[2][i] = c[i - 1];
  58. t.n = k + 1;
  59. t.m = 1;
  60. for(i = 2; i <= k + 1; i++)
  61. {
  62. t.a[i][1] = b[k - i + 2];
  63. t.a[1][1] = (t.a[1][1] + b[i - 1]) % p;
  64. }
  65. if(n - k > 0)
  66. sum1 = (sum ^ (n - k)) * t;
  67. else for(i = 1; i <= n; i++)
  68. sum1.a[1][1] = (sum1.a[1][1] + b[i]) % p;
  69. if(m - k - 1 > 0)
  70. sum2 = (sum ^ (m - k - 1)) * t;
  71. else for(i = 1; i < m; i++)
  72. sum2.a[1][1] = (sum2.a[1][1] + b[i]) % p;
  73. printf("%lld\n", ((sum1.a[1][1] - sum2.a[1][1]) % p + p) % p);
  74. return 0;
  75. }

  

[luoguP2461] [SDOI2008]递归数列(DP + 矩阵优化)的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ3231: [Sdoi2008]递归数列

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

  6. hdu 4576(简单概率dp | 矩阵优化)

    艰难的一道题,体现出菜菜的我... 首先,先吐槽下. 这题到底出题人是怎么想的,用普通概率dp水过??? 那为什么我概率dp写的稍微烂点就一直tle?  感觉很不公平.大家算法都一致,因为我程序没有那 ...

  7. CF1151F Sonya and Informatics (计数dp+矩阵优化)

    题目地址 Solution (duyi是我们的红太阳) (这里说一句:这题看上去是一个概率dp,鉴于这题的概率dp写法看上去不好写,我们其实可以写一个计数dp) 首先拿到这个题目我们要能设出一个普通d ...

  8. Codeforces 917C - Pollywog(状压 dp+矩阵优化)

    UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...

  9. New Year and Old Subsequence CodeForces - 750E (dp矩阵优化)

    大意: 给定字符串, 每次询问区间[l,r]有子序列2017, 无子序列2016所需要删除的最小字符数 转移用矩阵优化一下, 要注意$(\mathbb{Z},min,+)$的幺元主对角线全0, 其余全 ...

随机推荐

  1. solr facet查询及solrj 读取facet数据[转]

    solr facet查询及solrj 读取facet数据 | 所属分类:solr facet solrj 一.   Facet 简介 Facet 是 solr 的高级搜索功能之一 , 可以给用户提供更 ...

  2. nodejs on raspi

    一. https://cnodejs.org/topic/54032efa9769c2e93797cd06 其中的 “安装Node.js” 一节 注意事项: 1. 它用的是v0.10.26(很早的版本 ...

  3. Math.net,.net上的科学计算利器

    F#在科学计算领域的应用,包括部分语法介绍. Math.net,.net上的科学计算利器 摘要: .net上科学计算个人觉得首选numpy和scipy for dotnet.因为这两个库用户数量已经非 ...

  4. Selenium私房菜系列2 -- XPath的使用【ZZ】

    在编写Selenium案例时,少不免是要用到XPath的,现在外面关于XPath使用的参考资料很多,下面我直接转一篇关于XPath使用的文档.如果对XPath不熟悉请参考下文,你不需要去百度/Goog ...

  5. iview modal 弹框 模板

    iview modal 弹框 模板 <!-- * @description 上传图片 * @fileName camera.vue * @author 彭成刚 * @date // :: * @ ...

  6. AspNetCore容器化(Docker)部署(一) —— 入门

    一.docker注册安装 Windows Docker Desktop https://www.docker.com/products/docker-desktop Linux Docker CE h ...

  7. freemarker list集合去重,实现hashset

    在freemarker中没有提供去重的方法,虽然有提供定义hash的方法,如:<#assign myHash = { "name": "mouse", & ...

  8. win手动编译JAVA 未完成(系统path未加入文章)

    java 下面存.BAT dir /s /B *.java > sources.txtjavac @sources.txt -bootclasspath "C:\Users\88797 ...

  9. SQL比较两表字段和字段类型

    一.问题 业务需要把TB_Delete_KYSubProject表数据恢复到TB_KYSubProject,但提示错误,错误原因是两表字段类型存在不一致 insert into [TB_KYSubPr ...

  10. WebGL 绘制Line的bug(三)

    之前铺垫了许多,今天可以来分享点纯干货了. 上一篇已经讲述了通过面模拟线条时候,每一个顶点的顶点数据包括:端点坐标.偏移量.前一个端点坐标.后一个端点坐标,当然如果我们通过索引的方式来绘制的话,还包括 ...