地址 http://poj.org/problem?id=3233

大意是n维数组 最多k次方  结果模m的相加和是多少

Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + … + Ak.

Sample Input

  1. 2 2 4
  2. 0 1
  3. 1 1

Sample Output

  1. 1 2
  2. 2 3

题解

矩阵逐步的相乘然后相加是不可以 但是矩阵也有类似快速幂的做法

/*
A + A^2 =A(I+A)

A + A^2 + A^3 + A^4 = (A + A^2)(I + A^2)
记做sum(n) = A +A^2 +A^3 +...+A^n
如果n是偶数 sum(n) = sum(n/2)(I+A^(n/2))
如果n是奇数 sum(n) = sum(n-1) + A^n
= sum((n-1)/2)(I+A^((n-1)/2)) + A^n
*/

代码如下

  1. #include <iostream>
  2. #include <cstring>
  3.  
  4. using namespace std;
  5.  
  6. struct matrix {
  7. int data[][];
  8. };
  9.  
  10. int n = ;
  11. int m = ;
  12. int k = ;
  13.  
  14. //矩阵乘法
  15. matrix mul(matrix a, matrix b)
  16. {
  17. matrix c;
  18. memset(c.data, , sizeof(c.data));
  19. for (int i = ; i <= n; i++) {
  20. for (int j = ; j <= n; j++) {
  21. for (int k = ; k <= n; k++) {
  22. c.data[i][j] = (c.data[i][j] + 1ll * a.data[i][k] * b.data[k][j]) % m;
  23. }
  24. }
  25. }
  26.  
  27. return c;
  28. }
  29.  
  30. //矩阵加法
  31. matrix add(matrix a, matrix b) {
  32. for (int i = ; i <= n; i++) {
  33. for (int j = ; j <= n; j++) {
  34. a.data[i][j] = (a.data[i][j] + b.data[i][j])%m;
  35. }
  36. }
  37. return a;
  38. }
  39.  
  40. //矩阵快速幂
  41. matrix quickpow(matrix a, int k) {
  42. matrix c;
  43. memset(c.data, , sizeof(c.data));
  44. for (int i = ; i <= n; i++)
  45. c.data[i][i] = ;
  46. while (k) {
  47. if (k & ) c = mul(c, a);
  48. k >>= ;
  49. a = mul(a, a);
  50. }
  51. return c;
  52. }
  53.  
  54. //正式计算 sum k
  55. matrix sum(matrix a, int k) {
  56. if (k == ) return a;
  57. matrix c;
  58. memset(c.data, , sizeof(c.data));
  59. for (int i = ; i <= n; i++)
  60. c.data[i][i] = ;
  61. c = add(c, quickpow(a, k >> ));
  62. c = mul(c, sum(a, k >> ));
  63. if (k & ) c = add(c, quickpow(a, k));
  64. return c;
  65. }
  66.  
  67. /*
  68. A + A^2 =A(I+A)
  69.  
  70. A + A^2 + A^3 + A^4 = (A + A^2)(I + A^2)
  71. 记做sum(n) = A +A^2 +A^3 +...+A^n
  72. 如果n是偶数 sum(n) = sum(n/2)(I+A^(n/2))
  73. 如果n是奇数 sum(n) = sum(n-1) + A^n
  74. = sum((n-1)/2)(I+A^((n-1)/2)) + A^n
  75. */
  76.  
  77. int main()
  78. {
  79. matrix mat;
  80. cin >> n;
  81. cin >> k;
  82. cin >> m;
  83.  
  84. for (int i = ; i <= n; i++) {
  85. for (int j = ; j <= n; j++) {
  86. cin >> mat.data[i][j];
  87. }
  88. }
  89.  
  90. matrix ret = sum(mat, k);
  91.  
  92. for (int i = ; i <= n; i++) {
  93. for (int j = ; j <= n; j++) {
  94. cout << ret.data[i][j] << " ";
  95. }
  96. cout << endl;
  97. }
  98. }

poj 3233 矩阵快速幂的更多相关文章

  1. POJ 3233 矩阵快速幂&二分

    题意: 给你一个n*n的矩阵 让你求S: 思路: 只知道矩阵快速幂 然后nlogn递推是会TLE的. 所以呢 要把那个n换成log 那这个怎么搞呢 二分! 当k为偶数时: 当k为奇数时: 就按照这么搞 ...

  2. Poj 3233 矩阵快速幂,暑假训练专题中的某一道题目,矩阵快速幂的模板

    题目链接  请猛戳~ Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 ...

  3. poj 3233 矩阵快速幂+YY

    题意:给你矩阵A,求S=A+A^1+A^2+...+A^n sol:直接把每一项解出来显然是不行的,也没必要. 我们可以YY一个矩阵: 其中1表示单位矩阵 然后容易得到: 可以看出这个分块矩阵的左下角 ...

  4. poj 3734 矩阵快速幂+YY

    题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中 ...

  5. POJ 3070 矩阵快速幂解决fib问题

    矩阵快速幂:http://www.cnblogs.com/atmacmer/p/5184736.html 题目链接 #include<iostream> #include<cstdi ...

  6. 解题报告:poj 3070 - 矩阵快速幂简单应用

    2017-09-13 19:22:01 writer:pprp 题意很简单,就是通过矩阵快速幂进行运算,得到斐波那契数列靠后的位数 . 这是原理,实现部分就是矩阵的快速幂,也就是二分来做 矩阵快速幂可 ...

  7. POJ 3070 矩阵快速幂

    题意:求菲波那切数列的第n项. 分析:矩阵快速幂. 右边的矩阵为a0 ,a1,,, 然后求乘一次,就进一位,求第n项,就是矩阵的n次方后,再乘以b矩阵后的第一行的第一列. #include <c ...

  8. poj 3744 矩阵快速幂+概率dp

    题目大意: 输入n,代表一位童子兵要穿过一条路,路上有些地方放着n个地雷(1<=n<=10).再输入p,代表这位童子兵非常好玩,走路一蹦一跳的.每次他在 i 位置有 p 的概率走一步到 i ...

  9. poj 3233(矩阵高速幂)

    题目链接:http://poj.org/problem?id=3233. 题意:给出一个公式求这个式子模m的解: 分析:本题就是给的矩阵,所以非常显然是矩阵高速幂,但有一点.本题k的值非常大.所以要用 ...

随机推荐

  1. python高阶函数——返回函数(闭包)

    首先,来看一个一般意义的求和: >>> def cal_sum(*args): ... sum = 0 ... for i in args: ... sum = sum + i .. ...

  2. VisualStudio编译不生成xml、pdb文件的方法

    我们为了减少发布/Release时项目的体积,希望在编译时不生成xml注释文档(包括引用的其他类库),和pdb调试文件 用你喜欢的文本编辑器打开项目.csproj文件,找到PropertyGroup节 ...

  3. 51-overlay 是如何隔离的?

    不同的 overlay 网络是相互隔离的.我们创建第二个 overlay 网络 ov_net2 并运行容器 bbox3. bbox3 分配到的 IP 是 10.0.1.2,尝试 ping bbox1( ...

  4. Linux命令详解 三

    Linux用户和组的属性与权限本章结构1.用户账号和组账号概述2.用户账号和组账号管理3.查询账号信息4.查看目录或文件的属性5.设置目录或文件的权限6.设置目录或文件的归属 前言在linux中一切都 ...

  5. 电池中的NTC功能是什么?【转】

    电池的NTC功能是什么 因为可充电电池在不断的循环充电和放电过程中可能会导致电池温度的过高,导致电池原始性能下降.为了保持电池性能,密切监测电池温度非常重要,NTC在充电电池组内部的合适应用中可以起到 ...

  6. 池化技术(一)Druid是如何管理数据库连接的?

    基于依赖程序的版本信息:druid:1.1.16               驱动程序mysql-connector-java:8.0.17 下一篇:HikariCP是如何管理数据库连接的 零.类图& ...

  7. opencv在VS2017上的环境搭建

    最近开始做一个图像识别的小项目,需要安装opencv,VS里报的错迷的一批,网上教程好多,找了好长时间,终于找的两个解决了问题,在这儿记录一下. 安装很简单,在opencv官网(https://ope ...

  8. Thymeleaf实现页面静态化

    如果用户所有的请求,都需要Thyleaf渲染后直接返回给用户,后台就存在大量的查询操作,数据库的压力就会骤然上升,请求的时间就会延长,带来极不好用户体验,现在市面上流行的就是页面的静态化处理,下面就来 ...

  9. Java 中 PO 与 VO 的区别

    什么是PO PO(Persistence Object 持久化对象)是直接跟持久层数据库打交道的java Bean (model,entity,bean等叫法都是可以的),里面除了私有的成员变量之外, ...

  10. [灵魂拷问]MySQL面试高频100问(工程师方向)

    作者:呼延十 juejin.im/post/5d351303f265da1bd30596f9 前言 本文主要受众为开发人员,所以不涉及到MySQL的服务部署等操作,且内容较多,大家准备好耐心和瓜子矿泉 ...