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 }
  • 相关阅读:
    游标cursor
    SQL: EXISTS
    LeetCode Reverse Integer
    LeetCode Same Tree
    LeetCode Maximum Depth of Binary Tree
    LeetCode 3Sum Closest
    LeetCode Linked List Cycle
    LeetCode Best Time to Buy and Sell Stock II
    LeetCode Balanced Binary Tree
    LeetCode Validate Binary Search Tree
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/11486417.html
Copyright © 2011-2022 走看看