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;

}

  

你可能感兴趣的:(HDU)