题意:求矩阵经过n次自乘以后对角线的和

解题思路:裸矩阵快速幂。

解题代码:

  1 // File Name: temp.cpp
  2 // Author: darkdream
  3 // Created Time: 2014年09月17日 星期三 11时35分45秒
  4 
  5 #include<vector>
  6 #include<list>
  7 #include<map>
  8 #include<set>
  9 #include<deque>
 10 #include<stack>
 11 #include<bitset>
 12 #include<algorithm>
 13 #include<functional>
 14 #include<numeric>
 15 #include<utility>
 16 #include<sstream>
 17 #include<iostream>
 18 #include<iomanip>
 19 #include<cstdio>
 20 #include<cmath>
 21 #include<cstdlib>
 22 #include<cstring>
 23 #include<ctime>
 24 #define LL long long
 25 #define m 9973
 26 using namespace std;
 27 int n , k; 
 28 struct Matrix
 29 {
 30    int  mat[20][20];
 31    void clear()
 32    {
 33       memset(mat,0,sizeof(mat));
 34    }
 35    void output()
 36    {
 37      for(int i =0  ;i < n ;i ++)
 38      {
 39        for(int j = 0 ;j < n ;j ++)
 40            printf("%d ",mat[i][j]);
 41      printf("\n");
 42      }
 43    }
 44    void init()
 45    {
 46       for(int i = 0;i < n ;i ++) 
 47           for(int j = 0 ;j < n;j ++)
 48           {
 49               scanf("%d",&mat[i][j]);
 50           }
 51    }
 52    Matrix operator *(const Matrix &b) const
 53    {
 54        Matrix ret;
 55        ret.clear();
 56        for(int i = 0 ;i < n ;i ++)
 57            for(int j = 0;j < n;j ++)
 58            {
 59                for(int k = 0 ;k < n ;k ++)
 60                {
 61                  ret.mat[i][j] =(ret.mat[i][j] + mat[i][k] * b.mat[k][j]) % m ; // 第I 行  第J  列        
 62                }
 63            }
 64        return ret;
 65    }
 66 };
 67 Matrix Pow( Matrix a ,int t )
 68 {
 69   Matrix ret;
 70   ret.clear();
 71   for(int i = 0 ;i < n ;i ++)
 72        ret.mat[i][i] = 1;
 73   Matrix tmp = a; 
 74   while(t)
 75   {
 76       if(t&1) ret = ret * tmp;
 77       tmp = tmp * tmp;
 78       t >>=1;
 79   }
 80   return ret;
 81 }
 82 int main(){
 83     int t; 
 84     scanf("%d",&t);
 85     while(t--)
 86     {
 87          scanf("%d %d",&n,&k);
 88          Matrix  a;
 89          a.init();
 90          //a.output();
 91          a = Pow(a,k);
 92          //a.output();
 93          int  ans = 0 ;
 94          for(int i = 0 ;i < n;i ++)
 95          {
 96             ans =(ans + a.mat[i][i]) % m ;
 97          }
 98       printf("%d\n",ans);
 99     }
100 return 0;
101 }
View Code

 

posted on 2014-09-17 15:18  dark_dream  阅读(128)  评论(0编辑  收藏  举报