POJ 3233 Matrix Power Series(矩阵快速幂)
2016-04-20 20:55
459 查看
Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 19338 Accepted: 8161
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
可以找到递推关系 : s[k]=s[k-1]+A^k;
然后构造矩阵,利用矩阵快速幂
具体见代码
Time Limit: 3000MS Memory Limit: 131072K
Total Submissions: 19338 Accepted: 8161
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
可以找到递推关系 : s[k]=s[k-1]+A^k;
然后构造矩阵,利用矩阵快速幂
具体见代码
#include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <stdio.h> #include <stdlib.h> using namespace std; int n,k; int m; struct Node { int a[65][65]; }; Node multiply(Node a,Node b) { Node c; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { c.a[i][j]=0; for(int k=1;k<=n;k++) { (c.a[i][j]+=(a.a[i][k]*b.a[k][j])%m)%=m; } } } return c; } Node quick(Node a,int x) { Node c; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) c.a[i][j]=(i==j?1:0); for(x;x>0;x>>=1) { if(x&1) c=multiply(c,a); a=multiply(a,a); } return c; } int main() { while( scanf("%d%d%d",&n,&k,&m)!=EOF) { Node a;Node b;Node c; memset(a.a,0,sizeof(a.a)); memset(b.a,0,sizeof(b.a)); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&a.a[i][j+n]); b.a[i+n][j+n]=a.a[i][j+n]; } for(int i=1;i<=n;i++) { b.a[i][i]=1; b.a[i+n][i]=1; } n=n*2; c=multiply(a,quick(b,k)); for(int i=1;i<=n/2;i++) for(int j=1;j<=n/2;j++) if(j==n/2)printf("%d\n",c.a[i][j]); else printf("%d ",c.a[i][j]); } return 0; }
相关文章推荐
- 【SPL标准库专题(8)】 Datastructures:SplFixedArray
- 【NOIP2015模拟11.3】IOIOI卡片占卜
- GCJ1C09C - Bribe the Prisoners
- Spymemcached操作队列分析
- CentOS 7, lamp
- jquery源码学习1
- windos基本命令 查看指定端口,将指定进程杀死
- 读写存储文件中的数据
- android下dev设备的权限问题
- 【POJ 1743】Musical Theme
- SharePoint 第一个网站
- 不圆
- Asp.net Mvc Action重定向总结
- HDU 2509 Be the Winner
- java中方法重载与重写的区别
- Linux常用命令(持续更新)
- 每日工作总结02
- Netty中ChannelHandler共享数据的方式
- Metal 着色语言编程指南 九
- 弹窗