HDU 1575 Tr A

 

http://acm.hdu.edu.cn/showproblem.php?pid=1575

矩阵+快速幂

A^k是A*A*A...(k个A相乘)

View Code
#include <iostream>

using namespace std ;

void mul(int a[11][11],int b[11][11],int n)

{

    int c[11][11] ;

    int i,j,k ;

    for(i=0;i<n;i++)

        for(j=0;j<n;j++)

            c[i][j]=0 ;

    for(i=0;i<n;i++)

        for(j=0;j<n;j++)

            for(k=0;k<n;k++)

                c[i][j]=(c[i][j]+a[i][k]*b[k][j])%9973 ;

    for(i=0;i<n;i++)

        for(j=0;j<n;j++)

            a[i][j]=c[i][j] ;

}

void qpow(int m[11][11],__int64 k,int n)

{

    int ans[11][11] ;

    int buff[11][11] ;

    int i,j ;

    for(i=0;i<n;i++)

        for(j=0;j<n;j++)

            if(i==j)

                ans[i][j]=1 ;

            else

                ans[i][j]=0 ;

    for(i=0;i<n;i++)

        for(j=0;j<n;j++)

            buff[i][j]=m[i][j] ;

    while(k)

    {

        if(k&1)

            mul(ans,buff,n) ;

        mul(buff,buff,n) ;

        k>>=1 ;

    }

    for(i=0;i<n;i++)

        for(j=0;j<n;j++)

            m[i][j]=ans[i][j] ;

}

int main()

{

    int t ;

    int m[11][11] ;

    scanf("%d",&t) ;

    while(t--)

    {

        int n ;

        __int64 k ;

        scanf("%d%I64d",&n,&k) ;

        for(int i=0;i<n;i++)

            for(int j=0;j<n;j++)

                scanf("%d",&m[i][j]) ;

        qpow(m,k,n) ;

        int ans=0 ;

        for(int i=0;i<n;i++)

            for(int j=0;j<n;j++)

                if(i==j)

                    ans=(ans+m[i][j])%9973 ;

        printf("%d\n",ans) ;

    }

    return 0 ;

}

 

你可能感兴趣的:(HDU)