挑战程序设计竞赛---POJ.3233
2016-07-16 17:06
295 查看
【题意】给定n*n的矩阵A和正整数k和m。求矩阵A的幂的和!
【解题方法】可以参见《挑战程序设计》205页!
【AC代码】
//POJ.3233
//Matrix Power Series
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct Matrix{
int a[62][62];
}A;
int n,k,m;
Matrix operator*(const Matrix &a,const Matrix &b)
{
Matrix c;
for(int i=0; i<2*n; i++)
{
for(int j=0; j<2*n; j++)
{
c.a[i][j]=0;
for(int k=0; k<2*n; k++)
{
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%m;
}
}
}
return c;
}
Matrix pow(Matrix a,int x)
{
Matrix res;
for(int i=0; i<2*n; i++)
for(int j=0; j<2*n; j++)
if(i==j) res.a[i][j]=1;else res.a[i][j]=0;
while(x)
{
if(x&1) res=res*a;
a=a*a;
x>>=1;
}
return res;
}
int main()
{
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d",&A.a[i][j]);
}
}
for(int i=0; i<2*n; i++)
{
for(int j=0; j<2*n; j++)
{
if(i<n)
{
if(j<n) continue;
else A.a[i][j]=0;
}
else
{
if(j==i-n) A.a[i][j]=1;
else if(j==i) A.a[i][j]=1;
else A.a[i][j]=0;
}
}
}
A=pow(A,k+1);
for(int i=0; i<2*n; i++)
{
if(i>=n)
{
for(int j=0; j<n; j++)
{
if(i-n==j) A.a[i][j]=(A.a[i][j]-1+m)%m;
printf("%d%c",A.a[i][j],j==n-1?'\n':' ');
}
}
}
}
}
【解题方法】可以参见《挑战程序设计》205页!
【AC代码】
//POJ.3233
//Matrix Power Series
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct Matrix{
int a[62][62];
}A;
int n,k,m;
Matrix operator*(const Matrix &a,const Matrix &b)
{
Matrix c;
for(int i=0; i<2*n; i++)
{
for(int j=0; j<2*n; j++)
{
c.a[i][j]=0;
for(int k=0; k<2*n; k++)
{
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j])%m;
}
}
}
return c;
}
Matrix pow(Matrix a,int x)
{
Matrix res;
for(int i=0; i<2*n; i++)
for(int j=0; j<2*n; j++)
if(i==j) res.a[i][j]=1;else res.a[i][j]=0;
while(x)
{
if(x&1) res=res*a;
a=a*a;
x>>=1;
}
return res;
}
int main()
{
while(scanf("%d%d%d",&n,&k,&m)!=EOF)
{
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d",&A.a[i][j]);
}
}
for(int i=0; i<2*n; i++)
{
for(int j=0; j<2*n; j++)
{
if(i<n)
{
if(j<n) continue;
else A.a[i][j]=0;
}
else
{
if(j==i-n) A.a[i][j]=1;
else if(j==i) A.a[i][j]=1;
else A.a[i][j]=0;
}
}
}
A=pow(A,k+1);
for(int i=0; i<2*n; i++)
{
if(i>=n)
{
for(int j=0; j<n; j++)
{
if(i-n==j) A.a[i][j]=(A.a[i][j]-1+m)%m;
printf("%d%c",A.a[i][j],j==n-1?'\n':' ');
}
}
}
}
}
相关文章推荐
- [Leetcode]204. Count Primes
- Tomcat无故宕机原因分析
- 灰度共生矩阵的定义以及算法
- Java 值交换详解
- [安卓开发] Broadcast 三种广播的使用总结
- ROS学习需要看的网络教程_整理
- 利用SharePoint 2013 创建Service Desk 网站之分配一线工程师支持!
- 关于/r与/n 以及 /r/n 的区别总结
- 在AndroidStudio中使用Lambda表达式
- CentOS7关闭SELinux
- JSX,Html语法需注意的部分
- light OJ -DNA Prefix (字典树)
- Jre和JDK的区别
- Spring注解@Scope("prototype")
- ThinkPad紧凑型蓝牙键盘(0B47189)鼠标滚轮用法,F1到F12功能键的功能切换以及其他技巧
- ImagePicker
- SQL— CONCAT(字符串连接函数)
- 用SCMD2.0.8.0汉化版制作OB地图简易教程
- QFile类中遇到的问题
- 计算几何 模板 (判断点是否在线段上)