Matrix Power Series
Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 12346   Accepted: 5262

Description

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

Input

The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m < 104). Then follow n lines each containing n nonnegative integers below 32,768, giving A’s elements in row-major order.

Output

Output the elements of S modulo m in the same way as A is given.

Sample Input

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

Sample Output

  1. 1 2
  2. 2 3

我比较喜欢用数组做矩阵乘法而不是用结构体做,而且用数组做效率更高,本代码poj跑了460ms,代码中有详细注释

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<string>
  6. #include<queue>
  7. #include<algorithm>
  8. #include<map>
  9. #include<iomanip>
  10. #define INF 99999999
  11. using namespace std;
  12.  
  13. const int MAX=30+10;
  14. __int64 array[MAX][MAX],sum[MAX][MAX],temp[MAX][MAX],ans[MAX][MAX];
  15. int n,m,k;
  16. //array记录初始矩阵,sum记录每次幂乘后的矩阵,temp临时矩阵,ans记录结果矩阵
  17.  
  18. void MatrixInit(__int64 a[MAX][MAX],bool flag){//初始化矩阵,可以初始化为1或者A
  19. for(int i=0;i<n;++i){
  20. for(int j=0;j<n;++j){
  21. if(flag)a[i][j]=array[i][j];//初始化为矩阵A(A是指题目中的A,也就是这里的array)
  22. else a[i][j]=(i == j);//初始化为矩阵1
  23. }
  24. }
  25. }
  26.  
  27. void MatrixAdd(__int64 a[MAX][MAX],__int64 b[MAX][MAX],int &mod){//矩阵相加,a为相加后的矩阵
  28. for(int i=0;i<n;++i){
  29. for(int j=0;j<n;++j){
  30. a[i][j]=(a[i][j]+b[i][j])%mod;
  31. }
  32. }
  33. }
  34.  
  35. void MatrixMult(__int64 a[MAX][MAX],__int64 b[MAX][MAX],int &mod){//矩阵相乘,a为相乘后的矩阵
  36. __int64 c[MAX][MAX]={0};
  37. for(int i=0;i<n;++i){
  38. for(int j=0;j<n;++j){
  39. for(int k=0;k<n;++k){
  40. c[i][j]+=a[i][k]*b[k][j];
  41. }
  42. }
  43. }
  44. for(int i=0;i<n;++i){
  45. for(int j=0;j<n;++j)a[i][j]=c[i][j]%mod;
  46. }
  47. }
  48.  
  49. void MatrixPow(int k,int &mod){//矩阵快速幂
  50. MatrixInit(sum,0);//初始化sum为1
  51. MatrixInit(temp,1);//初始化temp为A
  52. while(k){
  53. if(k&1)MatrixMult(sum,temp,mod);
  54. MatrixMult(temp,temp,mod);
  55. k>>=1;
  56. }
  57. }
  58.  
  59. void MatrixSum(int k,int &mod){//矩阵和
  60. if(k == 1){MatrixInit(ans,1);return;}
  61. MatrixSum(k/2,mod);
  62. MatrixPow((k+1)/2,mod);
  63. if(k&1){//k为奇数则A+(A+A^m)*(A+A^2+A^3...),m=(k+1)/2
  64. MatrixInit(temp,1);//初始化temp为A
  65. MatrixAdd(sum,temp,mod);//计算A+A^m,m=(k+1)/2
  66. MatrixMult(ans,sum,mod);//计算(A+A^m)*(A^1+A^2+...)
  67. MatrixAdd(ans,temp,mod);//计算A+(A+A^m)*(A^1+A^2...)
  68. }
  69. else{//k为偶数则(1+A^m)*(A+A^2+A^3...),m=(k+1)/2
  70. MatrixInit(temp,0);//初始化temp为1
  71. MatrixAdd(temp,sum,mod);//计算1+A^m,m=(k+1)/2
  72. MatrixMult(ans,temp,mod);//计算(1+A^m)*(A^1+A^2+...)
  73. }
  74. }
  75.  
  76. int main(){
  77. scanf("%d%d%d",&n,&k,&m);
  78. for(int i=0;i<n;++i){
  79. for(int j=0;j<n;++j){
  80. scanf("%I64d",&array[i][j]);
  81. ans[i][j]=0;//ans是矩阵和
  82. }
  83. }
  84. MatrixSum(k,m);//矩阵和:A^1+A^2+A^3+A^4+A^5+A^6=(A^1+A^2+A^3)+A^3(A^1+A^2+A^3)
  85. for(int i=0;i<n;++i){
  86. for(int j=0;j<n-1;++j)printf("%d ",ans[i][j]);
  87. printf("%I64d\n",ans[i][n-1]);
  88. }
  89. return 0;
  90. }

poj3233之经典矩阵乘法的更多相关文章

  1. hdu1588之经典矩阵乘法

    Gauss Fibonacci Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. zoj3497(经典矩阵乘法)

    原以为是用搜索做的题,想了好久都无法想到一个高效正确的解法. 后面发现竟然这就是矩阵的应用! 碉堡! 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值  ——选自ma ...

  3. 学习心得:《十个利用矩阵乘法解决的经典题目》from Matrix67

    本文来自:http://www.matrix67.com/blog/archives/tag/poj大牛的博文学习学习 节选如下部分:矩阵乘法的两个重要性质:一,矩阵乘法不满足交换律:二,矩阵乘法满足 ...

  4. 【转】Matrix67:十个利用矩阵乘法解决的经典题目

    好像目前还没有这方面题目的总结.这几天连续看到四个问这类题目的人,今天在这里简单写一下.这里我们不介绍其它有关矩阵的知识,只介绍矩阵乘法和相关性质.    不要以为数学中的矩阵也是黑色屏幕上不断变化的 ...

  5. 【矩阵乘法经典应用】【ZOJ3497】【Mistwa】

    题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点.也就是说从起点出发,走一条长度为P的路径,路径中 ...

  6. poj3233 题解 矩阵乘法 矩阵快速幂

    题意:求S = A + A2 + A3 + … + Ak.(mod m) 这道题很明显可以用矩阵乘法,但是这道题的矩阵是分块矩阵, 分块矩阵概念如下:当一个矩阵A中的单位元素aij不是一个数值而是一个 ...

  7. POJ3233 [C - Matrix Power Series] 矩阵乘法

    解题思路 题目里要求\(\sum_{i=1}^kA^i\),我们不妨再加上一个单位矩阵,求\(\sum_{i=0}^kA^i\).然后我们发现这个式子可以写成这样的形式:\(A(A(A...)+E)+ ...

  8. 矩阵乘法优化DP复习

    前言 最近做毒瘤做多了--联赛难度的东西也该复习复习了. Warning:本文较长,难度分界线在"中场休息"部分,如果只想看普及难度的可以从第五部分直接到注意事项qwq 文中用(比 ...

  9. CH Round #30 摆花[矩阵乘法]

    摆花 CH Round #30 - 清明欢乐赛 背景及描述 艺术馆门前将摆出许多花,一共有n个位置排成一排,每个位置可以摆花也可以不摆花.有些花如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看 ...

随机推荐

  1. button元素兼容问题浅析

    缺省type属性值 <button>提交</button> button元素的type属性值有submit.button可选,在上面这种没有明确指出type值的情况下,浏览器的 ...

  2. 关于#ifndef,#define,#end的说明

    #ifndef,#define,#end 是宏定义的一种---条件编译 这样我直接举个例子好了:我定义两个相同的类A分别在single.h和singlenew.h single.h: #include ...

  3. uva 1589 by sixleaves

    坑爹的模拟题目.自己对于这种比较复杂点得模拟题的能力概述还不够,还多加练习.贴别是做得时候一直再想如何检查车中间有没有棋子,炮中间有没有棋子.到网上参考别人的代码才发先这么简单的办法,自己尽然想不到. ...

  4. 2.8 Classes of Restricted Estimators

    根据所加限制的不同,可以将模型分为以下几类 RSS+Roughness penalty $PRSS(f;\lambda)=RSS(f)+\lambda J(f)$ 其中$J(f)$为对函数$f$的pe ...

  5. vue.js的devtools安装

    安装 1.github下载地址:https://github.com/vuejs/vue-devtools 2.下载好后进入vue-devtools-master工程  执行npm install - ...

  6. 【转】android 电池(二):android关机充电流程、充电画面显示

    关键词:android 电池关机充电 androidboot.mode charger关机充电 充电画面显示 平台信息:内核:linux2.6/linux3.0系统:android/android4. ...

  7. js点击事件防止用户重复点击执行

    点击事件里给button标签加一个自定义属性,存上次点击时间 追问: 求详细代码,JS 真心的没怎么做过 追答:   <input type="button" id=&quo ...

  8. Unity 代码规范(PlateFace)1.0版本

    PlateFace Unity开发规范(1.0) 1.项目都采用英文名命名,图片,音频,资源都不能采用中文. 2.方法名: 帕斯卡命名(所有单词首字母大写) 3.字段: 在Unity中组件字段名第一个 ...

  9. struts2复习(五)拦截器总结

    1. 拦截器(Interceptor): 拦截器是Struts2的核心,Struts2的众多功能都是通过拦截器来实现的. 2. 拦截器的配置 1)编写实现Interceptor 接口的类.  2)在s ...

  10. 力挺8天入门wpf【转载】

    8天入门wpf—— 第八天 最后的补充 摘要: 从这一篇往前看,其实wpf中还有很多东西没有讲到,不过我的原则还是将比较常用的知识点过一遍,如果大家熟悉了这些知识,基本功也就打的差不多了,后续可以等待 ...