zoukankan      html  css  js  c++  java
  • [HDOJ1575]Tr A

    Tr A

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


    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 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <cmath>
     5 
     6 using namespace std;
     7 
     8 #define MOD 9973
     9 #define MAXN 15
    10 
    11 typedef struct MAT
    12 {
    13     int d[MAXN][MAXN];
    14     int r, c;
    15     MAT() 
    16     {
    17         r = c = 0;
    18         memset(d, 0, sizeof(d));
    19     }
    20 }MAT;
    21 
    22 MAT mul(MAT m1, MAT m2, int mod)
    23 {
    24     MAT ans = MAT();
    25     ans.r = m1.r;
    26     ans.c = m2.c;
    27     for(int i = 1; i <= m1.r; i++)
    28     {
    29         for(int j = 1; j <= m2.r; j++)
    30         {
    31             if(m1.d[i][j])
    32             {
    33                 for(int k = 1; k <= m2.c; k++)
    34                 {
    35                     ans.d[i][k] = (ans.d[i][k] + m1.d[i][j] * m2.d[j][k]) % mod;
    36                 }
    37             }
    38         }
    39     }
    40     return ans;
    41 }
    42 
    43 MAT quickmul(MAT m, int n, int mod)
    44 {
    45     MAT ans = MAT();
    46     for(int i = 1; i <= m.r; i++)
    47     {
    48         ans.d[i][i] = 1;
    49     }
    50     ans.r = m.r;
    51     ans.c = m.c;
    52     while(n)
    53     {
    54         if(n & 1)
    55         {
    56             ans = mul(m, ans, mod);
    57         }
    58         m = mul(m, m, mod);
    59         n >>= 1;
    60     }
    61     return ans;
    62 }
    63 
    64 int main()
    65 {
    66     int T;
    67     scanf("%d", &T);
    68     while(T--)
    69     {
    70         int n, k;
    71         scanf("%d %d", &n, &k);
    72         MAT A = MAT();
    73         A.r = n, A.c = n;
    74         for(int i = 1; i <= n; i++)
    75         {
    76             for(int j = 1; j <= n; j++)
    77             {
    78                 scanf("%d", &A.d[i][j]);
    79             }
    80         }
    81         A = quickmul(A, k, MOD);
    82         int ans = 0;
    83         for(int i = 1; i <= n; i++)
    84         {
    85             ans += A.d[i][i];
    86         }
    87         printf("%d
    ", ans % MOD);
    88     }
    89     return 0;
    90 }
    View Code
  • 相关阅读:
    问答
    观看视频后的笔记
    处理json的常用方式
    通过excel模板文件根据数据库数据修改其中的单元格数据
    declare用法
    添加文件然后自动打开
    Mybatis之入门
    观察者模式
    职责链模式
    并发新构件之Exchanger:交换器
  • 原文地址:https://www.cnblogs.com/kirai/p/4575728.html
Copyright © 2011-2022 走看看