您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息