矩阵快速幂 hud 1575 Tr A 模板 *

Tr A

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


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

矩阵快速幂的模板题

#include<iostream>
#include<cstdio>
#include<cstring>
#define mod 9973
#define maxn 12 
using namespace std;
struct mat{
    int s[maxn][maxn],n;
    mat (int n1){//构造器
        n = n1;
        memset(s,0,sizeof(s));//一定要初始化
    }
    void init(){
        for(int i=1;i<=n;i++){//单位矩阵的初始化,切记!
            s[i][i] = 1;//如果没有这个的话就不能直接相乘
        }
    }
    mat operator * (const mat m){
        mat ans(this->n);//理解this的用法
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                for(int k=1;k<=n;k++){
                    ans.s[i][j] = (ans.s[i][j] + this->s[i][k] * m.s[k][j])%mod;
                }
            }
        }
        return ans;
    }
};
mat quick_mod(mat &m,int p){//和整数快速幂一样的方法,只不过这里面的乘是矩阵的相乘
    mat ans(m.n);
    ans.init();// ans一定要为单位矩阵的!
    while(p){
        if(p&1){
            ans = ans * m;
        }
        m = m*m;
        p >>= 1;
    }
    return ans;
}
int main()
{
    int t,n,k;
    cin >> t;
    while(t--){
        cin >> n >> k;
        mat m(n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                cin >> m.s[i][j];
            }
        }
        mat ans(n);
        ans = quick_mod(m,k);
        int sum = 0;
        for(int i=1;i<=n;i++){
            sum = (sum+ans.s[i][i])%mod;
        }
        cout << sum << endl;
    }
    return 0;
}
彼时当年少,莫负好时光。
原文地址:https://www.cnblogs.com/l609929321/p/7273941.html