Matrix Power Series(矩阵快速幂+求幂和)

来源:互联网 发布:农大网络远程教育 编辑:程序博客网 时间:2024/06/06 12:29


Link:http://poj.org/problem?id=3233


Matrix Power Series
Time Limit: 3000MS Memory Limit: 131072KTotal Submissions: 17862 Accepted: 7546

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 40 11 1

Sample Output

1 22 3

Source

POJ Monthly--2007.06.03, Huang, Jinsong


AC code:

#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<vector>#include<queue>#include<map>#define LL long long#define MAXN 1000010using namespace std;const int INF=0x3f3f3f3f;//----以下为矩阵快速幂模板-----// //const int mod=1000;//模3,故这里改为3即可 int mod=1000;const int NUM=32;//定义矩阵能表示的最大维数 int N;//N表示矩阵的维数,以下的矩阵加法、乘法、快速幂都是按N维矩阵运算的 struct Mat{//矩阵的类int a[NUM][NUM];Mat(){memset(a,0,sizeof(a));}  void init()//将其初始化为单位矩阵  {memset(a,0,sizeof(a));for(int i=0;i<NUM;i++){a[i][i]=1;}}};Mat add(Mat a,Mat b)//(a+b)%mod  矩阵加法  {Mat ans;for(int i=0;i<N;i++){for(int j=0;j<N;j++){ans.a[i][j]=(a.a[i][j]%mod)+(b.a[i][j]%mod);ans.a[i][j]%=mod;}}return ans;}Mat mul(Mat a,Mat b) //(a*b)%mod  矩阵乘法  {Mat ans;for(int i=0;i<N;i++){for(int j=0;j<N;j++){ans.a[i][j]=0;for(int k=0;k<N;k++){ans.a[i][j]=(ans.a[i][j]%mod)+(a.a[i][k]%mod)*(b.a[k][j]%mod);}ans.a[i][j]%=mod;}}return ans;}Mat power(Mat a,int num)//(a^n)%mod  矩阵快速幂 {Mat ans;ans.init();while(num){if(num&1){ans=mul(ans,a);}num>>=1;a=mul(a,a);}return ans;}Mat pow_sum(Mat a,int num)//(a+a^2+a^3....+a^n)%mod 矩阵的幂和{int m;Mat ans,pre;if(num==1)return a;m=num/2;pre=pow_sum(a,m);ans=add(pre,mul(pre,power(a,m)));if(num&1)ans=add(ans,power(a,num));return ans;}void output(Mat a)//输出矩阵 {for(int i=0;i<N;i++){for(int j=0;j<N;j++){printf("%d%c",a.a[i][j],j==N-1?'\n':' ');}}}//----以上为矩阵快速幂模板-----// int main(){//freopen("D:\in.txt","r",stdin);int n,m,i,j,T,k;scanf("%d%d%d",&n,&k,&m); Mat A,S;N=n;mod=m;for(i=0;i<N;i++){for(j=0;j<N;j++){scanf("%d",&A.a[i][j]);}}S=pow_sum(A,k);output(S);return 0;}


0 0
原创粉丝点击