poj3233——矩阵

来源:互联网 发布:淘宝怎样添加多个客服 编辑:程序博客网 时间:2024/06/07 23:16

题目要求是给出一个n阶方阵A,然后求A^1+A^2+A^3+A^4+A^5……+A^k,然后对和矩阵的每项对m取模。

与杭电的4565相似,也用到矩阵快速幂,快速幂不赘述。主要是要构造矩阵

A  E

0  E                问题转化成求该矩阵的k+1次方。

注意快速幂过程中对每个元素取余后加上m,因为如果最后有元素为4,取余后就为0,在最后要减去单位矩阵的时候就变成负数了(其实这个位置应该是3)

在cfree中memset函数定义在iostream中,但是poj的编译器里用memset必须包含cstring。

#include<iostream>#include<cstring>using namespace std;typedef struct Matrix{int row[70][70];}matrix;int n,m;matrix multi(matrix a,matrix b){matrix c;memset(c.row,0,sizeof(c.row));for(int i=0;i<=2*n-1;++i){for(int t=0;t<=2*n-1;++t){for(int h=0;h<=2*n-1;++h){c.row[i][t]+=a.row[i][h]*b.row[h][t];c.row[i][t]=(c.row[i][t]%m+m);}}}return c;}matrix multi_pow(matrix a,int k){matrix c;memset(c.row,0,sizeof(c.row));for(int i=0;i<=2*n-1;++i){c.row[i][i]=1;}matrix t=a;while(k){if(k&1)c=multi(c,t);t=multi(t,t);k>>=1;}return c;}int main(){int k;cin>>n>>k>>m;matrix B;matrix x;memset(B.row,0,sizeof(B.row));memset(x.row,0,sizeof(x.row));for(int i=0;i<=n-1;++i){for(int t=0;t<=n-1;++t){cin>>x.row[i][t];}}B=x;for(int i=0;i<=n-1;++i){B.row[i][n+i]=1;}for(int i=0;i<=n-1;++i){B.row[n+i][n+i]=1;}B=multi_pow(B,k+1);matrix re;memset(re.row,0,sizeof(re.row));for(int i=0;i<=n-1;++i){for(int t=0;t<=n-1;++t){re.row[i][t]=B.row[i][n+t];}}for(int i=0;i<=n-1;++i){re.row[i][i]=re.row[i][i]-1;}for(int i=0;i<=n-1;++i){for(int t=0;t<=n-1;++t){cout<<re.row[i][t]%m<<' ';}cout<<endl;}return 0;} 


原创粉丝点击