hdu1575(矩阵快速幂基础)

来源:互联网 发布:java游戏服务器端 编辑:程序博客网 时间:2024/06/05 21:17

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1575

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 5724    Accepted Submission(s): 4302


Problem Description
A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的和),现要求Tr(A^k)%9973。 
Input
数据的第一行是一个T,表示有T组数据。
每组数据的第一行有n(2 <= n <= 10)和k(2 <= k < 10^9)两个数据。接下来有n行,每行有n个数据,每个数据的范围是[0,9],表示方阵A的内容。 

Output
对应每组数据,输出Tr(A^k)%9973。 

Sample Input
22 21 00 13 999999991 2 34 5 67 8 9
 

Sample Output
22686
题意:中文题面,我们就不说了吧。
思路:就是简单的矩阵快速幂。
矩阵快速幂推荐学习:http://blog.csdn.net/wust_zzwh/article/details/52058209
代码:
#include<bits/stdc++.h>using namespace std;const int mod=9973;const int maxn=15;int n;struct Matrix{    int a[maxn][maxn];    void init()    {        memset(a,0,sizeof(a));        for(int i=0;i<maxn;i++) a[i][i]=1;    }}A;Matrix mul(Matrix a,Matrix b){    Matrix ans;    for(int i=0;i<maxn;i++)    {        for(int j=0;j<maxn;j++)        {            ans.a[i][j]=0;            for(int k=0;k<maxn;k++)            {                ans.a[i][j]+=(a.a[i][k]*b.a[k][j]+mod)%mod;                ans.a[i][j]%=mod;            }        }    }    return ans;}Matrix pow(Matrix a,int n){    Matrix ans;    ans.init();    while(n)    {        if(n&1) ans=mul(ans,a);        n>>=1;        a=mul(a,a);    }    return ans;}int main(){    int T;    scanf("%d",&T);    while(T--)    {        Matrix ans;        int k;        scanf("%d%d",&n,&k);        for(int i=0;i<n;i++)        {            for(int j=0;j<n;j++)            {                scanf("%d",&A.a[i][j]);            }        }        ans=pow(A,k);        int sum=0;        for(int i=0;i<n;i++)        {            sum=(sum+ans.a[i][i])%mod;        }        printf("%d\n",sum%mod);    }    return 0;}


 
原创粉丝点击