hdu 1575 Tr A (二分矩阵)

Tr A

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


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
 
Author
xhd
 
Source
 
Recommend
linle   |   We have carefully selected several similar problems for you:  1757 1588 2256 2254 3117 
 
 1 //0MS    212K    969 B    G++
 2 /*
 3 
 4     第一次 做矩阵的题.有点渣,不过这题是水题。 
 5 
 6 */
 7 #include<stdio.h>
 8 #include<string.h>
 9 #define N 9973
10 struct matrix{
11     int g[15][15];
12 }temp,ans;
13 int n;
14 matrix mutil(matrix a,matrix b)
15 {
16     matrix c;
17     for(int i=0;i<n;i++)
18         for(int j=0;j<n;j++){
19             c.g[i][j]=0;
20             for(int k=0;k<n;k++){
21                 c.g[i][j]+=a.g[i][k]*b.g[k][j]; 
22                 c.g[i][j]%=N;
23             }
24         }
25     return c;
26 }
27 void solve(int k)
28 {
29     while(k){
30         if(k&1) ans=mutil(temp,ans);
31         temp=mutil(temp,temp);
32         k/=2;
33     }
34     int sum=0;
35     for(int i=0;i<n;i++){
36         sum+=ans.g[i][i];
37         sum%=N;
38     }
39     printf("%d
",sum);
40 }
41 int main(void)
42 {
43     int t,k;
44     scanf("%d",&t);
45     while(t--)
46     {
47         scanf("%d%d",&n,&k);
48         for(int i=0;i<n;i++)
49             for(int j=0;j<n;j++){
50                 ans.g[i][j]=(i==j);
51                 scanf("%d",&temp.g[i][j]);
52             }
53         solve(k);
54     }
55     return 0;
56 } 
原文地址:https://www.cnblogs.com/GO-NO-1/p/3655138.html