题目链接:https://vjudge.net/problem/UVA-11149

题意:

给出矩阵A,求出A^1 + A^2 …… + A^k 。

题解:

1.可知:A^1 + A^2 …… + A^k = (1+A^k/2)*(A^1 + A^2 …… + A^k/2)+ (k%2?A^k:0)。

2.根据上述式子,可二分对其求解。

代码如下:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <vector>
  6. #include <cmath>
  7. #include <queue>
  8. #include <stack>
  9. #include <map>
  10. #include <string>
  11. #include <set>
  12. using namespace std;
  13. typedef long long LL;
  14. const int INF = 2e9;
  15. const LL LNF = 9e18;
  16. //const int MOD = 1e9+7;
  17. const int MAXN = 1e6+;
  18.  
  19. const int MOD = ;
  20. int Size;
  21. struct MA
  22. {
  23. LL mat[][];
  24. void init()
  25. {
  26. for(int i = ; i<Size; i++)
  27. for(int j = ; j<Size; j++)
  28. mat[i][j] = (i==j);
  29. }
  30. };
  31.  
  32. MA mul(MA x, MA y)
  33. {
  34. MA ret;
  35. memset(ret.mat, , sizeof(ret.mat));
  36. for(int i = ; i<Size; i++)
  37. for(int j = ; j<Size; j++)
  38. for(int k = ; k<Size; k++)
  39. ret.mat[i][j] += 1LL*x.mat[i][k]*y.mat[k][j]%MOD, ret.mat[i][j] %= MOD;;
  40. return ret;
  41. }
  42.  
  43. MA add(MA x, MA y)
  44. {
  45. MA ret;
  46. memset(ret.mat, , sizeof(ret.mat));
  47. for(int i = ; i<Size; i++)
  48. for(int j = ; j<Size; j++)
  49. ret.mat[i][j] = x.mat[i][j]+y.mat[i][j], ret.mat[i][j] %= MOD;
  50. return ret;
  51. }
  52.  
  53. MA qpow(MA x, LL y)
  54. {
  55. MA s;
  56. s.init();
  57. while(y)
  58. {
  59. if(y&) s = mul(s, x);
  60. x = mul(x, x);
  61. y >>= ;
  62. }
  63. return s;
  64. }
  65.  
  66. MA solve(MA x, int k)
  67. {
  68. if(k==) return x;
  69. MA s;
  70. s.init();
  71. s = mul(add(s, qpow(x, k/)), solve(x, k/));
  72. if(k%) s = add(s, qpow(x, k));
  73. return s;
  74. }
  75.  
  76. int main()
  77. {
  78. int n, k;
  79. while(scanf("%d%d", &n,&k)&&n)
  80. {
  81. MA s;
  82. Size = n;
  83. memset(s.mat, , sizeof(s.mat));
  84. for(int i = ; i<n; i++)
  85. for(int j = ; j<n; j++)
  86. {
  87. scanf("%lld", &s.mat[i][j]);
  88. s.mat[i][j] %= MOD;
  89. }
  90.  
  91. s = solve(s, k);
  92. for(int i = ; i<n; i++)
  93. {
  94. for(int j = ; j<n; j++)
  95. printf("%lld%s", s.mat[i][j], j==n-?"\n":" ");
  96. }
  97. printf("\n");
  98. }
  99. }

UVA11149 Power of Matrix —— 矩阵倍增、矩阵快速幂的更多相关文章

  1. Luogu 3390 【模板】矩阵快速幂 (矩阵乘法,快速幂)

    Luogu 3390 [模板]矩阵快速幂 (矩阵乘法,快速幂) Description 给定n*n的矩阵A,求A^k Input 第一行,n,k 第2至n+1行,每行n个数,第i+1行第j个数表示矩阵 ...

  2. Luogu T7152 细胞(递推,矩阵乘法,快速幂)

    Luogu T7152 细胞(递推,矩阵乘法,快速幂) Description 小 X 在上完生物课后对细胞的分裂产生了浓厚的兴趣.于是他决定做实验并 观察细胞分裂的规律. 他选取了一种特别的细胞,每 ...

  3. UVa 11149 Power of Matrix(倍增法、矩阵快速幂)

    题目链接: 传送门 Power of Matrix Time Limit: 3000MS      Description 给一个n阶方阵,求A1+A2+A3+......Ak. 思路 A1+A2+. ...

  4. poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Descri ...

  5. HDU4965 Fast Matrix Calculation —— 矩阵乘法、快速幂

    题目链接:https://vjudge.net/problem/HDU-4965 Fast Matrix Calculation Time Limit: 2000/1000 MS (Java/Othe ...

  6. Power of Matrix 等比数列求和 矩阵版!

    #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #inclu ...

  7. HDU1575Tr A(矩阵相乘与快速幂)

    Tr A hdu1575 就是一个快速幂的应用: 只要知道怎么求矩阵相乘!!(比赛就知道会超时,就是没想到快速幂!!!) #include<iostream> #include<st ...

  8. bzoj 3240: [Noi2013]矩阵游戏 矩阵乘法+十进制快速幂+常数优化

    3240: [Noi2013]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 613  Solved: 256[Submit][Status] ...

  9. bzoj 3240 矩阵乘法+十进制快速幂

    首先,构造出从f[][i]->f[][i+1]的转移矩阵a,和从f[i][m]->f[i+1][1]的转移矩阵b, 那么从f[1][1]转移到f[n][m]就是init*(a^(m-1)* ...

随机推荐

  1. vim可视化&Linux系统安全最小化原则& su & sudo

    一.vim在可视化模式下编辑 crl+v,会变成-- VISUAL BLOCK --,然后用上下左右键去选中. 多行注释: ESC进入命令行模式; Ctrl+v进入VISUAL BLOCK模式 上下左 ...

  2. 提高速度 history 的利用

    history的介绍history是shell的内置命令,其内容在系统默认的shell的man手册中.history是显示在终端输入并执行的过命令,系统默认保留1000条.[root@localhos ...

  3. kafka技术分享02--------kafka入门

    kafka技术分享02--------kafka入门 1. 消息系统 ​ 所谓的Messaging System就是一组规范,企业利用这组规范在不同的系统之间传递语义准确对的消息,实现松耦合的异步数据 ...

  4. Android图片缓存之Lru算法(二)

    前言: 上篇我们总结了Bitmap的处理,同时对比了各种处理的效率以及对内存占用大小.我们得知一个应用如果使用大量图片就会导致OOM(out of memory),那该如何处理才能近可能的降低oom发 ...

  5. [Hibernate开发之路](3)基础配置

    一 JDBC链接 通常你希望SessionFactory来为你创建和缓存(pool)JDBC连接. 假设你採用这样的方式, 仅仅须要例如以下例所看到的那样,打开一个Session: Session s ...

  6. 完美删除vector的内容与释放内存

    问题:stl中的vector容器常常造成删除假象,这对于c++程序员来说是极其讨厌的,<effective stl>大师已经将之列为第17条,使用交换技巧来修整过剩容量.内存空洞这个名词是 ...

  7. 点击选中/取消选中flag

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  8. C语言关键字—-sizeof 、typedef、const、static、register、extern、#define

    关键字:sizeof .#define.typedef.const.static.register.extern sizeof 1. 作用:求数据所占得内存空间大小 2. 本质:求数据得类型所占的内存 ...

  9. 分布式开源调度框架TBSchedule原理与应用

    主要内容: 第一部分 TBSchedule基本概念及原理 1. 概念介绍 2. 工作原理 3. 源代码分析 4. 与其它开源调度框架对照 第二部分 TBSchedule分布式调度演示样例 1. TBS ...

  10. ORACLE 36进制和10进制,互相转换函数

    第一部分 --36转10进制 create or replace function f_36to10 (str varchar) return int  is returnValue int;   s ...