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

2 2 4
0 1
1 1

Sample Output

1 2
2 3

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

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<map>
#include<iomanip>
#define INF 99999999
using namespace std; const int MAX=30+10;
__int64 array[MAX][MAX],sum[MAX][MAX],temp[MAX][MAX],ans[MAX][MAX];
int n,m,k;
//array记录初始矩阵,sum记录每次幂乘后的矩阵,temp临时矩阵,ans记录结果矩阵 void MatrixInit(__int64 a[MAX][MAX],bool flag){//初始化矩阵,可以初始化为1或者A
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
if(flag)a[i][j]=array[i][j];//初始化为矩阵A(A是指题目中的A,也就是这里的array)
else a[i][j]=(i == j);//初始化为矩阵1
}
}
} void MatrixAdd(__int64 a[MAX][MAX],__int64 b[MAX][MAX],int &mod){//矩阵相加,a为相加后的矩阵
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
a[i][j]=(a[i][j]+b[i][j])%mod;
}
}
} void MatrixMult(__int64 a[MAX][MAX],__int64 b[MAX][MAX],int &mod){//矩阵相乘,a为相乘后的矩阵
__int64 c[MAX][MAX]={0};
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
for(int k=0;k<n;++k){
c[i][j]+=a[i][k]*b[k][j];
}
}
}
for(int i=0;i<n;++i){
for(int j=0;j<n;++j)a[i][j]=c[i][j]%mod;
}
} void MatrixPow(int k,int &mod){//矩阵快速幂
MatrixInit(sum,0);//初始化sum为1
MatrixInit(temp,1);//初始化temp为A
while(k){
if(k&1)MatrixMult(sum,temp,mod);
MatrixMult(temp,temp,mod);
k>>=1;
}
} void MatrixSum(int k,int &mod){//矩阵和
if(k == 1){MatrixInit(ans,1);return;}
MatrixSum(k/2,mod);
MatrixPow((k+1)/2,mod);
if(k&1){//k为奇数则A+(A+A^m)*(A+A^2+A^3...),m=(k+1)/2
MatrixInit(temp,1);//初始化temp为A
MatrixAdd(sum,temp,mod);//计算A+A^m,m=(k+1)/2
MatrixMult(ans,sum,mod);//计算(A+A^m)*(A^1+A^2+...)
MatrixAdd(ans,temp,mod);//计算A+(A+A^m)*(A^1+A^2...)
}
else{//k为偶数则(1+A^m)*(A+A^2+A^3...),m=(k+1)/2
MatrixInit(temp,0);//初始化temp为1
MatrixAdd(temp,sum,mod);//计算1+A^m,m=(k+1)/2
MatrixMult(ans,temp,mod);//计算(1+A^m)*(A^1+A^2+...)
}
} int main(){
scanf("%d%d%d",&n,&k,&m);
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
scanf("%I64d",&array[i][j]);
ans[i][j]=0;//ans是矩阵和
}
}
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)
for(int i=0;i<n;++i){
for(int j=0;j<n-1;++j)printf("%d ",ans[i][j]);
printf("%I64d\n",ans[i][n-1]);
}
return 0;
}

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. B-JUI(Best jQuery UI) 前端框架

    From :http://b-jui.com/大略看了下还不错,收藏之.

  2. UESTC_韩爷的梦 2015 UESTC Training for Search Algorithm & String<Problem N>

    N - 韩爷的梦 Time Limit: 200/100MS (Java/Others)     Memory Limit: 1300/1300KB (Java/Others) Submit Stat ...

  3. FTA

    FTA - 维基百科,自由的百科全书 FTA 维基百科,自由的百科全书   跳转至: 导航. 搜索 FTA可以指: 自由贸易协定(Free Trade Agreement) 自由贸易区(Free Tr ...

  4. Impala 3、Impala、Hbase整合

    Impala可以通过Hive外部表方式和HBase进行整合,步骤如下: • 步骤1:创建hbase 表,向表中添加数据 create 'test_info', 'info' put 'test_inf ...

  5. 【转】android 电容屏(二):驱动调试之基本概念篇

    关键词:android  电容屏 tp 工作队列 中断 多点触摸协议平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310(samsung ...

  6. 玩转iOS开发 - JSON 和 Xml 数据解析

    前言 Json 和xml是网络开发中经常使用的数据格式,JSON轻量级.xml相对较复杂.所以如今用JSON的比例很大.基本上从server获取的返回数据都是JSON格式的,作为iOS开发人员,解析J ...

  7. 如何对应用服务性能问题诊断(Tomcat、Weblogic中间件)

    在我们web项目中,我们常见的web应用服务器有Tomcat.Weblogic.WebSphere.它们是互联网应用系统的基础架构软件,也叫“中间件”,负责处理动态在页面请求,并为应用提供了名字.事务 ...

  8. pt-table-checksum解读

    pt-table-checksum是目前可以说是最好的查看主从一致性的工具 先来个使用例子,有助快速上手使用 在主库执行: mysql>GRANT SELECT, PROCESS, SUPER, ...

  9. dojo.hasClass/dojo.addClass/dojo.removeClass/dojo.toggleClass/dojo.repalceClass

    dojo.hasClass(/*DomNode*/node or DomIdstring,/*String*/classString)//如果节点中有特定的类,那么返回ture,否则返回false d ...

  10. Android之日期及时间选择对话框

    转:http://www.cnblogs.com/linjiqin/archive/2011/03/10/1980215.html main.xml布局文件 <?xml version=&quo ...