hdu 1575 Tr A 解题报告

这个主要是矩阵2分快速幂

 

#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
struct aa
{
 int a[11][11];
};
aa f(aa m,aa n,int nn)
{
 aa ans;
 for(int i=0;i<nn;i++)
  for(int j=0;j<nn;j++)
  {
   ans.a[i][j]=0;
   for(int k=0;k<nn;k++)
    ans.a[i][j]+=m.a[i][k]*n.a[k][j];
   ans.a[i][j]%=9973;
  }
 return ans;
}
int mul(aa m,int n,long k)
{
 aa ans;
 int i,j;
 int sum;
 for(i=0;i<n;i++)
  for(j=0;j<n;j++)
   ans.a[i][j]=(i==j);  //注意这里单位阵的作用
 while(k)
 {
  if(k&1)
  {
   ans=f(ans,m,n);
  }
  k>>=1;
  m=f(m,m,n);
 }
 sum=0;
 for(i=0;i<n;i++)
  sum+=ans.a[i][i];
 return sum%9973;
}
int main()
{
 long m;
 int t,n,i,j;
 scanf("%d",&t);
 while(t--)
 {
  aa p;
  scanf("%d%d",&n,&m);
  for(i=0;i<n;i++)
   for(j=0;j<n;j++)
    scanf("%d",&p.a[i][j]);
  printf("%d\n",mul(p,n,m));
 }
 return 0;
}
View Code

 

 

 

posted @ 2013-05-19 12:51  _随心所欲_  阅读(157)  评论(0)    收藏  举报