• HDU1575--Tr A(矩阵快速幂)


    Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)

    Total Submission(s): 99 Accepted Submission(s): 74

    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

    HDU 2007-1 Programming Contest

    Recommend

    linle

     

    矩阵快速幂的模版题目

    需要注意的是需要在矩阵乘法运算过程中每次都模9973,不然会爆int

    代码

    #include<bits/stdc++.h>
    using namespace std;
        int n,k;
    struct  node
    {
        int m[12][12];
        node(){
            memset(m,0,sizeof(m));
        }
    };
    int mod=9973;
    node multi(node &a,node &b)
    {
        node tmp;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                int sum=0;
                for(int k=0;k<n;k++){
                    sum+=(a.m[i][k]%mod)*(b.m[k][j]%mod);
                }
                tmp.m[i][j]=sum%mod;
            }
        }
        return tmp;
    }
    void e_mat(node &a)
    {
        for(int i=0;i<n;i++){
            a.m[i][i]=1;
        }
    }
    node quick_mul(node &a,int n)
    {
        node tmp=a;
        //e_mat(tmp);
        node res;
        e_mat(res);
        if(n&1){
            res=a;
        }
        n=n>>1;
        while(n!=0){
            tmp=multi(tmp,tmp);
            if(n&1){
                res=multi(res,tmp);
            }
            n=n>>1;
        }
        return res;
    }
    int main()
    {
        freopen("data.in","r",stdin);
        int t;
        cin>>t;
        while(t--){
            cin>>n>>k;
            node t,res;
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                    cin>>t.m[i][j];
            }
            res=quick_mul(t,k);
            int ans=0;
            for(int i=0;i<n;i++){
                ans+=res.m[i][i];
                ans%=mod;
            }
            cout<<ans%mod<<endl;
        }
    }
  • 相关阅读:
    szoj657 【AHSDFZNOI 7.2 WuHongxun】Odd
    cogs2652 秘术「天文密葬法」
    bzoj1026 [SCOI2009]windy数
    bzoj1862/1056: [Zjoi2006]GameZ游戏排名系统
    java-PreparedStatement的用法
    java-JDBC登录注册代码
    java-String Date Calendar之间的转换
    java-如何用eclipse打包jar
    java-通过JDBC操作数据库
    java-JDBC配置驱动程序
  • 原文地址:https://www.cnblogs.com/liuzhanshan/p/6368980.html
Copyright © 2020-2023  润新知