POJ 3233
来源:互联网 发布:网络奇兵2重制版 编辑:程序博客网 时间:2024/05/14 16:44
题意:就矩阵幂的和
做法:线性代数课上有,单个矩阵也是可以当成一个矩阵中的元素的
所以构建矩阵|A o| |A|
|E E| 其中o 是零矩阵。,和矩阵|o|,在计算第一矩阵的n次幂之后再与第二个矩阵相乘,这样,就在第二个矩阵的o矩阵处,就是答案
#include<cstdio>#include<cstring>#define LMT 65using namespace std;typedef class matrix{ public: int n,m; void init(void) { memset(mat,0,sizeof(mat)); } int mat[LMT][LMT]; friend matrix operator *(const matrix&,const matrix&);}matrix;matrix a,trans;int n,k,mod; matrix operator *(const matrix& a,const matrix &b){ matrix tem; tem.n=a.n;tem.m=b.m; for(int i=0;i<a.n;i++) for(int j=0;j<b.m;j++) { tem.mat[i][j]=0; for(int t=0;t<a.m;t++) tem.mat[i][j]=(tem.mat[i][j]+a.mat[i][t]*b.mat[t][j])%mod; } return tem;}int main(void){ while(scanf("%d%d%d",&n,&k,&mod)!=EOF) { matrix tem; tem.init(); tem.n=tem.m=n<<1; a.init(); trans.init(); a.n=n<<1;a.m=n; trans.m=trans.n=n<<1; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { scanf("%d",&a.mat[i][j]); a.mat[i][j]%=mod; trans.mat[i][j]=a.mat[i][j]; } trans.mat[i+n][i+n]=trans.mat[i+n][i]=1; } for(int i=0;i<n<<1;i++) tem.mat[i][i]=1; while(k) { if(k&1)tem=tem*trans; trans=trans*trans; k>>=1; } trans=tem; a=trans*a; for(int i=0;i<n;i++) { for(int j=0;j<n;j++) printf("%d ",a.mat[i+n][j]); printf("\n"); } } return 0;}
- poj 3233
- POJ 3233
- POJ 3233
- POJ 3233
- poj 3233
- Poj 3233
- POJ 3233
- poj 3233
- POJ 3233
- POJ 3233
- POJ 3233
- POJ 3233
- POJ 3233
- poj 3233 矩阵乘方
- poj 3233 矩阵
- POJ 3233 (矩阵)
- POJ
- poj
- 资源搜索
- ubuntu下deactivate matlab的操作
- 基于Get的AJAX
- Oracle 11G RAC 本地时间和通过listener连接时间不相同的问题
- HBase, HDFS and durable sync
- POJ 3233
- Extjs4实现两个GridPanel之间数据拖拽功能
- Linux rpm 命令参数使用详解 收藏
- JDeveloper中將日誌打印在控制臺中
- JAVA中int、String的类型转换
- syntax和semantics的区别
- gcc与g++区别
- 多键技术
- codeforces 242d