【单位矩阵】【杭电OJ1575】

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6490    Accepted Submission(s): 4817

Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。
 
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。
 
Output
对应每组数据,输出Tr(A^k)%9973。
 
Sample Input
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
 
Sample Output
2 2686
题目分析:这不同于上一篇博客那道题目,这个是要求一个矩阵本身的若干次幂,而上一篇是两个矩阵相乘,
      这道题需要引入一个单位矩阵【它的作用和实数里面的1一样,是一个在i==j也就是对角线上为1,其余位置为0的矩阵】
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 long long n,k;
 7 void mul(long long wqw[10][10],long long tat[10][10])
 8 {
 9     long long or2[10][10];
10     memset(or2,0,sizeof(or2));
11     for(int i = 0 ; i < n  ; i++)
12     {
13         for(int j = 0 ; j < n ; j++)
14         {
15             for(int kk = 0 ; kk < n ;kk++)
16             {
17                 or2[i][j]+=(wqw[i][kk]*(tat[kk][j]))%9973;
18                 or2[i][j]%=9973;
19             }
20         }
21     }
22     memcpy(wqw,or2,sizeof(or2));
23 }
24 void mulself(long long awa[10][10])
25 {
26     long long or3[10][10];
27     memset(or3,0,sizeof(or3));
28     for(int i = 0; i < n ; i++)
29     {
30         for(int j = 0 ; j< n ; j++)
31         {
32             for(int kk = 0 ; kk < n ; kk++)
33             {
34                 or3[i][j]+=((awa[i][kk])%9973)*((awa[kk][j])%9973)%9973;
35                 or3[i][j]%=9973;
36             }
37         }
38     }
39     memcpy(awa,or3,sizeof(or3));
40 }
41 int main()
42 {
43     int T;
44     scanf("%d",&T);
45     while(T--)
46     {
47         long long qwq[10][10],qaq[10][10];
48         scanf("%lld%lld",&n,&k);
49         memset(qwq,0,sizeof(qwq));
50         for(int i = 0 ; i < n ; i++)
51         {
52             for(int j = 0 ; j < n ; j++)
53             {
54                 scanf("%lld",&qaq[i][j]);
55                 if(i==j)
56                 qwq[i][j]=1;//1单位矩阵 
57             }
58         }
59 
60     while(k)
61     {
62         if(k&1)
63         mul(qwq,qaq);
64         mulself(qaq);
65         k/=2;
66     }
67     long long sum=0;
68     for(int i = 0 ; i < n ; i++)
69     {
70         sum+=(qwq[i][i]%9973);
71         sum%=9973;
72     }
73     cout << sum %9973 << endl;
74 }
75     return 0;
76 }

 

原文地址:https://www.cnblogs.com/MekakuCityActor/p/9008380.html