码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1575 矩阵快速幂

时间:2016-04-17 11:34:28      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

传送门

形式和数的快速幂是一致的,不过要定义struct的运算符

在矩阵的乘法运算中进行取模

#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<stack>
#include<queue>
#define forp(i,n) for(int i=1;i<=n;i++)
#define ptf(i) printf("%d\n",i)
#define scf(i) scanf("%d",&i)
const int MOD = 9973;
const int MAXN = 13;
typedef long long LL;

void init()
{

}
int T, n;

struct Mat{
    int mat[MAXN][MAXN];
};
Mat operator * (Mat a, Mat b);
Mat operator ^ (Mat a, int k);
int main()
{
    init();
    Mat m;
    int k, ans;
    scanf("%d",&T);
    while(T--){
        ans=0;
        scf(n);scf(k);
        forp(i,n)
            forp(j,n)
                scf(m.mat[i][j]);
        m=m^k;
        forp(i,n)
            ans=(ans+m.mat[i][i])%MOD;
        printf("%d\n",ans);
    }
    return 0;
}

Mat operator * (Mat a, Mat b){
    Mat c;
    forp(i,n)
        forp(j,n)
            c.mat[i][j]=0;
    forp(i,n)
        forp(j,n)
            forp(k,n)
                c.mat[i][j]=(c.mat[i][j]+a.mat[i][k]*b.mat[k][j])%MOD;
    return c;
}

Mat operator ^ (Mat a, int k){
    Mat c;
    forp(i,n)
        forp(j,n)
            c.mat[i][j]=(i==j);
    while(k){
        if(k&1)
            c=c*a;
        a=a*a;
        k>>=1;
    }
    return c;
}

 

hdu 1575 矩阵快速幂

标签:

原文地址:http://www.cnblogs.com/blueprintf/p/5400497.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!