zoukankan      html  css  js  c++  java
  • Tr A HDU 1575 (矩阵快速幂)

     1 #include<iostream>
     2 #include<vector>
     3 #include<string>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<cstdio>
     7 #include<cstring>
     8 #include<list>
     9 
    10 using namespace std;
    11 
    12 #define maxn 15
    13 int n, k;
    14 struct matrix//定义一个结构体,方便传递值
    15 {
    16     int m[maxn][maxn];
    17 };
    18 
    19 /*
    20 maxn和mod由全局定义,其中mod根据需要可以省去
    21 */
    22 
    23 matrix mul(matrix a, matrix b)    //矩阵求积, 矩阵乘法
    24 {
    25     matrix ans;
    26     for(int i = 1; i <= n; i++)
    27     {
    28         for(int j = 1; j <= n; j++)
    29         {
    30             ans.m[i][j] = 0;
    31             for(int k = 1; k <= n; k++)
    32             {
    33                 ans.m[i][j] += (a.m[i][k] * b.m[k][j]) % 9973;
    34                 ans.m[i][j] %= 9973;
    35             }
    36         }
    37     }
    38     return ans;
    39 }
    40 
    41 matrix quick_pow(matrix a, int b)    //矩阵快速幂
    42 {
    43     matrix ans;
    44     for(int i = 1; i <= n; i++)
    45     {
    46         for(int j = 1; j <= n; j++)
    47         {
    48             if(i == j)
    49                 ans.m[i][j] = 1;
    50             else
    51                 ans.m[i][j] = 0;//这里要初始化为单位矩阵,类比普通快速幂这里初始化为1
    52         }
    53     }
    54     while(b != 0)//方法与普通快速幂相同,只有乘法的实现不同
    55     {
    56         if(b % 2 == 1)
    57             ans = mul(a, ans);
    58         a = mul(a, a);
    59         b /= 2;
    60     }
    61 
    62     return ans;
    63 }
    64 
    65 
    66 int main()
    67 {
    68     int T;
    69     cin >> T;
    70     while(T--)
    71     {
    72         matrix a;
    73 
    74         cin >> n >> k;
    75         for(int i = 1; i<= n; ++i)
    76             for(int j = 1; j <= n; ++j)
    77                 cin >> a.m[i][j];
    78 
    79         matrix tmp = quick_pow(a, k);
    80         int ans = 0;
    81         for(int i = 1; i<= n; ++i)
    82             ans += tmp.m[i][i] % 9973;
    83 
    84         ans %= 9973;    // 最后这里一定要再次取余!
    85         cout << ans << endl;
    86     }
    87 
    88 
    89     return 0;
    90 }
  • 相关阅读:
    追寻缺失的大学精神 一个民族需要关注天空的人
    图论简介
    18个分形图形的GIF动画演示
    平行宇宙
    eclipse经常出现——未响应!!!
    单例模式
    Java内存区域
    编译与解释(java)
    正则表达式判断QQ号格式是否正确
    正则表达式判断手机号格式是否正确
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/11486417.html
Copyright © 2011-2022 走看看