Matrix Power Series

Time Limit: 3000MS   Memory Limit: 131072K
Total Submissions: 23187   Accepted: 9662

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
/*
矩阵乘法经典+二分
Sk=A+A2+A3+...+Ak
=(1+Ak/2)*(A+A2+A3+...+Ak/2)+{Ak}
=(1+Ak/2)*(Sk/2)+{Ak}
当k为偶数时不要大括号里面的数
*/
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std;
int n,m,k;
struct matrix
{
int a[][];
void init()
{
memset(a,,sizeof a);
for(int i=;i<;i++) a[i][i]=;
}
}; void print(matrix s)
{
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
if (j)
printf(" ");
printf("%d",s.a[i][j]%m);
}
printf("\n");
}
} matrix m_add(matrix a,matrix b)//加法
{
matrix c;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
c.a[i][j]=((a.a[i][j]+b.a[i][j])%m);
return c;
} matrix m_mul(matrix a,matrix b)//乘法
{
matrix c;
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
c.a[i][j]=;
for(int k=;k<n;k++)
c.a[i][j]+=((a.a[i][k]*b.a[k][j])%m);
c.a[i][j]%=m;
}
}
return c;
} matrix mul(matrix s,int k)//矩阵快速幂
{
matrix ans;ans.init();
while(k>=)
{
if(k&) ans=m_mul(ans,s);
k>>=;
s=m_mul(s,s);
}
return ans;
} matrix sum(matrix s,int k)//矩阵前k项求和
{
if(k==) return s;
matrix tmp;tmp.init();
tmp=m_add(tmp,mul(s,k>>));//计算1+A^(k/2)
tmp=m_mul(tmp,sum(s,k>>));//计算(1+A^(k/2))*(A+A^2+A^3+...+A^(k/2))
if(k&) tmp=m_add(tmp,mul(s,k));
return tmp;
} int main()
{
while(cin>>n>>k>>m)
{
matrix s;
for(int i=;i<n;i++)
for(int j=;j<n;j++)
scanf("%d",&s.a[i][j]);
s=sum(s,k);
print(s);
}
}
												

最新文章

  1. Rafy 领域实体框架 - 公司内部培训视频
  2. javascript判断数字是integer还是float
  3. java 线程 Thread 使用介绍,包含wait(),notifyAll() 等函数使用介绍
  4. GConf error:Failed to contact configuration server
  5. 关于Struts2的Validator的配置找不到DTD
  6. iOS - 数组与字典(NSArray &amp; NSDictionary)
  7. 基于局部敏感哈希的协同过滤算法之simHash算法
  8. linux 配置Socks5
  9. ADO.Net连接模式
  10. 常用的连接字符串(vs中连接sqlserver)方便随时查看
  11. 浏览器保存数据给app读取
  12. hdu1098
  13. Bring up a Kafka-based Ordering Service
  14. Saliency Detection via Graph-Based Manifold Ranking
  15. 洗礼灵魂,修炼python(87)-- 知识拾遗篇 —— 线程(1)
  16. 如何使用CSS 让Table的最后一列的右边框不显示
  17. FileZilla FTP Client
  18. Object对象的浅拷贝与深拷贝方法详解
  19. [转] VS2017 打包安装程序
  20. python 字符串与列表的相互转换 数据类型转换

热门文章

  1. js 闭包 定时器
  2. 查找java文件
  3. HyperLink的使用
  4. ES6 数组去重 方法用了filter或者 indexOf Array.from
  5. 基于fpga uart学习笔记
  6. [SQL Server] 常用sql脚本
  7. 洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊
  8. 绿色地址栏扩展验证(EV)SSL证书、支持SGC 强制最低128位
  9. poj 3621最优比例生成环(01分数规划问题)
  10. 最小生成树prime算法模板