hdu1575矩阵的快速幂

#include<iostream>
using namespace std;
const int MAXN=12;
const int MOD=9973;
struct matrix
{
    int data[MAXN][MAXN];
    int n;
    void init()
    {
        int i,j;
        for(i=0;i<=MAXN-1;i++)
        {
            for(j=0;j<=MAXN-1;j++)
            {
                data[i][j]=0;
            }
        }
        n=0;
    }
};

matrix multy(matrix m1,matrix m2)
{
    matrix r;
    r.init();
    int n=m1.n;
    r.n=n;
    int i,j,k;
    for(i=0;i<=n-1;i++)
    {
        for(j=0;j<=n-1;j++)
        {
            for(k=0;k<=n-1;k++)
            {
                r.data[i][j]=(r.data[i][j]+m1.data[i][k]*m2.data[k][j])%MOD;
            }
        }
    }
    return r;
}
matrix fast_mi(matrix a,int m)
{
    matrix r;
    r.init();
    r.n=a.n;
    int i=0;
    int n=a.n;
    for(i=0;i<=n-1;i++)
    {
        r.data[i][i]=1;
    }
    while(m)
    {
        if(m&1)
        {
            r=multy(r,a);
        }
        a=multy(a,a);
        m=m>>1;
    }
    return r;
}
int tr(matrix m)
{
    int sum=0;
    int i;
    for(i=0;i<=m.n-1;i++)
    {
        sum=(sum+m.data[i][i])%MOD;
    }
    return sum%MOD;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,m;
        cin>>n>>m;
        int i,j;
        matrix ma;
        ma.init();
        for(i=0;i<=n-1;i++)
        {
            for(j=0;j<=n-1;j++)
            {
                cin>>ma.data[i][j];
            }
        }
        ma.n=n;
        cout<<tr(fast_mi(ma,m))<<endl;
    }
    return 0;
}

  

posted @ 2012-08-01 14:14  77695  阅读(254)  评论(0编辑  收藏  举报