HDU1575-二分法-矩阵相乘

来源:互联网 发布:网络脆弱性扫描 编辑:程序博客网 时间:2024/06/06 00:49

推荐下 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;}


原创粉丝点击