• 矩阵快速幂 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;
    }
    彼时当年少,莫负好时光。
  • 相关阅读:
    Go 环境变量相关操作
    Go命令行参数解析flag包
    go sync.once用法
    使用go语言编写IOS和Android程序
    go map的使用
    go runtime.Gosched()的作用分析
    go中的读写锁RWMutex
    go互斥锁Mutex
    go import使用及. _的作用解析
    利用channel在goroutins之间控制同步和传递数据
  • 原文地址:https://www.cnblogs.com/l609929321/p/7273941.html
Copyright © 2020-2023  润新知