题意

题目链接

给出$n \times n$的矩阵$A$,求$\sum_{i = 1}^k A^i $,每个元素对$m$取模

Sol

考虑直接分治

当$k$为奇数时

$\sum_{i = 1}^k A^i = \sum_{i = 1}^{k / 2 + 1} A^i + A^{k / 2 + 1}(\sum_{i = 1}^{k / 2} A^i)$

当$k$为偶数时

$sum_{i = 1}^k = \sum_{i = 1}^{k / 2} A^i + A^{k / 2}(\sum_{i = 1}^{k / 2}A^i)$

当然还可以按套路对前缀和构造矩阵也是可以做的。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<map>
  5. #define LL long long
  6. using namespace std;
  7. int N, K, mod;
  8. int mul(int x, int y) {
  9. if(1ll * x * y > mod) return 1ll * x * y % mod;
  10. else return 1ll * x * y;
  11. }
  12. int add(int x, int y) {
  13. if(x + y > mod) return x + y - mod;
  14. else return x + y;
  15. }
  16. struct Matrix {
  17. int m[][];
  18. Matrix() {
  19. memset(m, , sizeof(m));
  20. }
  21. bool operator < (const Matrix &rhs) const {
  22. for(int i = ; i <= N; i++)
  23. for(int j = ; j <= N; j++)
  24. if(m[i][j] != rhs.m[i][j])
  25. return m[i][j] < rhs.m[i][j];
  26. return ;
  27. }
  28. Matrix operator * (const Matrix &rhs) const {
  29. Matrix ans;
  30. for(int k = ; k <= N; k++)
  31. for(int i = ; i <= N; i++)
  32. for(int j = ; j <= N; j++)
  33. ans.m[i][j] = add(ans.m[i][j], mul(m[i][k], rhs.m[k][j]));
  34. return ans;
  35. }
  36. Matrix operator + (const Matrix &rhs) const {
  37. Matrix ans;
  38. for(int i = ; i <= N; i++)
  39. for(int j = ; j <= N; j++)
  40. ans.m[i][j] = add(m[i][j], rhs.m[i][j]);
  41. return ans;
  42. }
  43. }a;
  44. Matrix getbase() {
  45. Matrix base;
  46. for(int i = ; i <= N; i++) base.m[i][i] = ;
  47. return base;
  48. }
  49. Matrix fp(Matrix a, int p) {
  50. Matrix base = getbase();
  51. while(p) {
  52. if(p & ) base = base * a;
  53. a = a * a; p >>= ;
  54. }
  55. return base;
  56. }
  57. Matrix solve(int k) {
  58. if(k == ) return a;
  59. Matrix res = solve(k / );
  60. if(k & ) {
  61. Matrix po = fp(a, k / + );
  62. return res + po + po * res;
  63. }
  64. else return res + fp(a, k / ) * res;
  65.  
  66. }
  67. main() {
  68. // freopen("a.in", "r", stdin);
  69. cin >> N >> K >> mod;
  70. for(int i = ; i <= N; i++)
  71. for(int j = ; j <= N; j++)
  72. cin >> a.m[i][j];
  73. Matrix ans = solve(K);
  74. for(int i = ; i <= N; i++, puts(""))
  75. for(int j = ; j <= N; j++)
  76. printf("%d ", ans.m[i][j] % mod);
  77. }

POJ3233Matrix Power Series(矩阵快速幂)的更多相关文章

  1. POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

    矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...

  2. POJ 3233 Matrix Power Series 矩阵快速幂

    设S[k] = A + A^2 +````+A^k. 设矩阵T = A[1] 0 E E 这里的E为n*n单位方阵,0为n*n方阵 令A[k] = A ^ k 矩阵B[k] = A[k+1] S[k] ...

  3. POJ3233:Matrix Power Series(矩阵快速幂+二分)

    http://poj.org/problem?id=3233 题目大意:给定矩阵A,求A + A^2 + A^3 + … + A^k的结果(两个矩阵相加就是对应位置分别相加).输出的数据mod m.k ...

  4. POJ 3233:Matrix Power Series 矩阵快速幂 乘积

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 18450   Accepted:  ...

  5. POJ3233 Matrix Power Series 矩阵快速幂 矩阵中的矩阵

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 27277   Accepted:  ...

  6. POJ3233:Matrix Power Series(矩阵快速幂+递推式)

    传送门 题意 给出n,m,k,求 \[\sum_{i=1}^kA^i\] A是矩阵 分析 我们首先会想到等比公式,然后得到这样一个式子: \[\frac{A^{k+1}-E}{A-E}\] 发现要用矩 ...

  7. POJ3233 Matrix Power Series(矩阵快速幂+分治)

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

  8. poj3233Matrix Power Series(矩阵乘法)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 23187   Accepted: ...

  9. POJ3233 Matrix Power Series(快速幂求等比矩阵和)

    题面 \(solution:\) 首先,如果题目只要我们求\(A^K\) 那这一题我们可以直接模版矩乘快速幂来做,但是它现在让我们求$\sum_{i=1}^{k}{(A^i)} $ 所以我们思考一下这 ...

随机推荐

  1. JConsole远程监控配置

    首先,看本机(Windows)安装了JRE没 Win > CMD 打开命令窗口 如有安装,则会显示以下版本信息:若没有显示,就安装吧 C:\Users\Administrator>java ...

  2. [Manacher+bit]Palindrome

    https://nanti.jisuanke.com/t/15428 题目大意:离散表示的字符串,求其最长回文串长度. 解题关键:若只用Manacher算法,在统计sum时会超时,所以加一个树状数组来 ...

  3. Linux服务器监控工具--Nmon介绍

    一.Nmon介绍(详细请参考百度百科) 是一款分析 AIX 和 Linux 性能的免费工具,这个高效的工具可以工作于任何哑屏幕.telnet 会话.甚至拨号线路.另外,它并不会消耗大量的 CPU 周期 ...

  4. sklearn解决过拟合的例子

    Learning curve 检视过拟合 sklearn.learning_curve 中的 learning curve 可以很直观的看出我们的 model 学习的进度, 对比发现有没有 overf ...

  5. 20169219《linux内核原理与分析》第六周作业

    网易云课堂学习 1.intel x86 CPU有四种不同的执行级别0-3,linux只使用了其中的0级和3级分贝来表示内核态和用户态. 2.一般来说在linux中,地址空间是一个显著的标志:0xc00 ...

  6. pure css简单组件,借鉴bootstrap

    <!doctype html> <html> <head> <meta http-equiv="Content-type" content ...

  7. CentOS6.5添加rbd模块

    [root@ceph-monitor opt]# modprobe rbd   FATAL: Module rbd not found. Once you have deployed the almi ...

  8. 对各种lca算法的理解

    1.RMQ+ST 首先注意这个算法的要素:结点编号,dfs序,结点深度. 首先dfs,求出dfs序,同时求出每个结点的深度.然后st算法,维护深度最小的结点编号(dfs序也可以,因为他们俩可以互相转换 ...

  9. 让你的Kivy支持中文字符

    前言 默认Kivy字体不支持中文,本文简单描述如何让你的应用支持中文字符 代码 from kivy.app import App from kivy.core.text import LabelBas ...

  10. SaltStack自动化安装配置haproxy

    准备环境node1:192.168.217.149 (saltstack master)node2:192.168.217.150(saltstack minion)下载haproxy1.6.2.ta ...