zoukankan      html  css  js  c++  java
  • hdu1575 Tr A---矩阵快速幂模板题

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1575

    题目大意:

    A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。

    解题思路:

    套模板即可:传送门:矩阵快速幂

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 100 + 10;
     4 const int MOD = 9973;
     5 struct Mat
     6 {
     7     int a[maxn][maxn];
     8     int n, m;//n为行数,m为列数
     9     Mat(int n, int m):n(n), m(m)
    10     {
    11         memset(a, 0, sizeof(a));
    12     }
    13     void init()
    14     {
    15         for(int i = 0; i < n; i++)a[i][i] = 1;//初始化成单位矩阵
    16     }
    17     void output()
    18     {
    19         for(int i = 0; i < n; i++)
    20         {
    21             for(int j = 0; j < m; j++)
    22             {
    23                 cout<<a[i][j]<<" ";
    24             }
    25             cout<<endl;
    26         }
    27     }
    28 };
    29 Mat mul(Mat a, Mat b)//矩阵乘法
    30 {
    31     Mat tmp(a.n, b.m);//矩阵乘法结果矩阵行数为a的行数,列数为b的列数
    32     for(int i = 0; i < a.n; i++)
    33     {
    34         for(int j = 0; j < b.m; j++)
    35         {
    36             for(int k = 0; k < a.m; k++)//a.m == b.n(乘法的前提条件)
    37             {
    38                 tmp.a[i][j] += (a.a[i][k] * b.a[k][j] % MOD);
    39                 tmp.a[i][j] %= MOD;
    40             }
    41         }
    42     }
    43     return tmp;
    44 }
    45 Mat pow(Mat a, int n)
    46 {
    47     Mat tmp(a.n, a.m);
    48     tmp.init();
    49     while(n)
    50     {
    51         if(n & 1)tmp = mul(tmp, a);
    52         n /= 2;
    53         a = mul(a, a);
    54     }
    55     return tmp;
    56 }
    57 int main()
    58 {
    59     int T, n, k;
    60     cin >> T;
    61     while(T--)
    62     {
    63         cin >> n >> k;
    64         Mat a(n, n);
    65         for(int i = 0; i < n; i++)
    66         {
    67             for(int j = 0; j < n; j++)
    68                 cin >> a.a[i][j];
    69         }
    70         a = pow(a, k);
    71         int ans = 0;
    72         for(int i = 0; i < n; i++)ans = (ans + a.a[i][i]) % MOD;
    73         ans %= MOD;
    74         cout<<ans<<endl;
    75     }
    76 }
  • 相关阅读:
    linux下base命令
    lldpd-0.7.7代码解读(send_pdu部分)
    openwrt 包makefile
    字符
    AC_CONFIG_HEADER
    大小端
    查看使用了那种shell
    debia下安装libjpeg
    工作流模式 (zhuan)
    1.2.1 工作流管理系统参考模型 (zhuan)
  • 原文地址:https://www.cnblogs.com/fzl194/p/8877332.html
Copyright © 2011-2022 走看看