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;}
- poj3233——矩阵
- 【poj3233】Matrix Power Series——矩阵快速幂
- POJ3233矩阵快速幂
- POJ3233 矩阵幂求和
- 矩阵快速幂--poj3233
- poj3233-矩阵构造
- poj3233 hdu 1588 (矩阵)
- 快速矩阵幂POJ3233
- POJ3233 矩阵快速幂
- poj3233(矩阵幂)
- POJ3233矩阵乘法
- poj3233(矩阵快速幂)
- 等比矩阵求和-POJ3233
- POJ3233不错的矩阵(矩阵套矩阵)
- poj3233之经典矩阵乘法
- POJ3233(矩阵二分再二分)
- poj3233矩阵快速幂运算
- POJ3233[矩阵连续幂之和]
- 单链表基本操作
- 第三章 例3.2
- 合并有序链表
- 2012年软件开发者薪资调查报告
- 做个精致的程序员
- poj3233——矩阵
- H264 encode and decode overview
- 如何成为编程高手
- 后缀数组求最长重复子串
- 开源项目之 AdFree Detector(屏蔽广告)
- 渐渐离我远去的25岁
- 互斥,游戏多开源码,针对目前90%的游戏
- POJ 1655 - DP 树的重心,经典 #P
- 后缀数组