hdu1575 - Tr A

输入一个矩阵,求他的k次幂,最后得到的矩阵对角线上相加即可

由于数据很大,要用矩阵的快速幂


知道了矩阵的快速幂,直接套用模板就可以

不知道的话,看我hdu1757有简单介绍

#include <iostream>

using namespace std;
int n,k,mod=9973;
struct matrix
{
    int m[15][15];
};
matrix x,y;

matrix operator*(matrix a,matrix b)
{
    matrix c;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            c.m[i][j] = 0;
            for(int K=0;K<n;K++){
                c.m[i][j]+=(a.m[i][K]*b.m[K][j])%mod;
            }
            c.m[i][j]%=mod;
        }
        }
        return c;

}
matrix Pow(matrix a,matrix b,int c)
{
    while(c){
        if(c&1){
            b = a*b;
        }
        a = a*a;
        c>>=1;
    }
    return b;
}


int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
     {cin>>x.m[i][j];y.m[i][j]=x.m[i][j];}
     matrix z=Pow(x,y,k-1);
     int sum=0;
     for(int i=0;i<n;i++)
        sum=(sum+z.m[i][i])%mod;
        cout<<sum%mod<<endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值