HDU1575-二分法-矩阵相乘
2013-08-27 15:54
267 查看
推荐下 Matrix67 大神的神作:十个利用矩阵乘法解决的经典题目
#include <iostream>
using namespace std;
const int MAXN = 15;
const int MOD = 9973;
typedef struct
{
int matrix[MAXN][MAXN];
}Matrix;
Matrix init;//初始化矩阵
Matrix unit;//单位矩阵
int n;
Matrix mul(Matrix a,Matrix b)//矩阵相乘
{
int i,j,k;
Matrix c;
for( i = 0 ; i < n ; i ++ )
for( j = 0 ; j < n ; j ++ )
{
c.matrix[i][j] = 0;
for( k = 0 ; k < n ; k ++ )
c.matrix[i][j] += a.matrix[i][k] * b.matrix[k][j];
c.matrix[i][j] = c.matrix[i][j] % MOD;
}
return c;
}
Matrix solve(int k)//采用二分法求
{
Matrix p = unit;
Matrix q = init;
while( k > 1 )
{
if( k % 2 == 1 )//为奇数,不满足二分
{
k --;
p = mul(p,q);//乘于单位矩阵,奇数部分一直累乘到p中
}
else
{
k = k / 2;
q = mul(q,q);//两边累乘
}
}
p = mul(p,q);//最终把多出的部分乘上偶数部分
return p;
}
int main()
{
int t,k,i,j,sum;
Matrix ans;
//freopen("1575.txt","r",stdin);
scanf("%d",&t);
while( t-- )
{
scanf("%d %d",&n,&k);
for( i = 0 ; i < n ; i ++ )
for( j = 0 ; j < n ; j ++ )
{
scanf("%d",&init.matrix[i][j]);
unit.matrix[i][j] = (i==j);
}
ans = solve(k);
sum = 0;
for( i = 0 ; i < n ; i ++ )
sum = (sum + ans.matrix[i][i]) % MOD;
printf("%d\n",sum);
}
return 0;
}
#include <iostream>
using namespace std;
const int MAXN = 15;
const int MOD = 9973;
typedef struct
{
int matrix[MAXN][MAXN];
}Matrix;
Matrix init;//初始化矩阵
Matrix unit;//单位矩阵
int n;
Matrix mul(Matrix a,Matrix b)//矩阵相乘
{
int i,j,k;
Matrix c;
for( i = 0 ; i < n ; i ++ )
for( j = 0 ; j < n ; j ++ )
{
c.matrix[i][j] = 0;
for( k = 0 ; k < n ; k ++ )
c.matrix[i][j] += a.matrix[i][k] * b.matrix[k][j];
c.matrix[i][j] = c.matrix[i][j] % MOD;
}
return c;
}
Matrix solve(int k)//采用二分法求
{
Matrix p = unit;
Matrix q = init;
while( k > 1 )
{
if( k % 2 == 1 )//为奇数,不满足二分
{
k --;
p = mul(p,q);//乘于单位矩阵,奇数部分一直累乘到p中
}
else
{
k = k / 2;
q = mul(q,q);//两边累乘
}
}
p = mul(p,q);//最终把多出的部分乘上偶数部分
return p;
}
int main()
{
int t,k,i,j,sum;
Matrix ans;
//freopen("1575.txt","r",stdin);
scanf("%d",&t);
while( t-- )
{
scanf("%d %d",&n,&k);
for( i = 0 ; i < n ; i ++ )
for( j = 0 ; j < n ; j ++ )
{
scanf("%d",&init.matrix[i][j]);
unit.matrix[i][j] = (i==j);
}
ans = solve(k);
sum = 0;
for( i = 0 ; i < n ; i ++ )
sum = (sum + ans.matrix[i][i]) % MOD;
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- Tr A hdu 1575 二分法矩阵相乘的高次幂
- 模板 2017-11-09 矩阵 单位化矩阵 矩阵的相乘和快速幂
- 矩阵相乘
- HDOJ 题目1575 Tr A(矩阵相乘,二分)
- 矩阵相乘的算法
- 矩阵相乘-c++代码实现及运行实例结果
- 矩阵相乘strassen-c++代码实现及运行实例结果
- 矩阵转置与矩阵相乘
- hdoj4920Matrix multiplication【矩阵相乘】
- hadoop矩阵相乘简单实现
- Python实现矩阵相乘的三种方法
- 行逻辑链接的顺序表实现稀疏矩阵的相乘(Java语言描述)
- 40.多线程实现矩阵相乘
- 矩阵相乘的两种方法
- 使用循环展开技术的矩阵相乘程序介绍
- 矩阵相乘的C代码实现
- 矩阵相乘
- 图像处理中的旋转与线性代数中的矩阵相乘的关系
- HDU1575Tr A(矩阵相乘与快速幂)
- 02_Tensorflow基础操作 -- 常量,矩阵相乘