【HDU-oj】-1575-Tr A(矩阵)

来源:互联网 发布:mac安装windows虚拟机 编辑:程序博客网 时间:2024/06/07 09:08

Tr A

Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4829    Accepted Submission(s): 3626


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
 

题解:矩阵快速幂的模板题。


#include <cstdio>#include <stack>#include <queue>#include <cmath>#include <vector>#include <cstring>#include <algorithm>using namespace std;#define CLR(a,b) memset(a,b,sizeof(a))#define INF 0x3f3f3f3f#define LL long longconst int MOD=9973;struct Matrix{int h,w;int m[12][12];};Matrix Matrix_multiply(Matrix a,Matrix b){Matrix c;c.h=a.h;c.w=b.w;CLR(c.m,0);for(int i=1;i<=a.h;i++){for(int j=1;j<=a.w;j++){if(a.m[i][i]==0)continue;for(int k=1;k<=b.w;k++)c.m[i][k]=(c.m[i][k]+a.m[i][j]*b.m[j][k]%MOD)%MOD;}}return c;}Matrix Quick(Matrix a,int n){Matrix ans;ans.h=ans.w=a.h;CLR(ans.m,0);for(int i=1;i<=a.h;i++)ans.m[i][i]=1;while(n){if(n&1)ans=Matrix_multiply(ans,a);n>>=1;a=Matrix_multiply(a,a);}return ans;}int main(){int u;scanf("%d",&u);while(u--){int k,n;scanf("%d%d",&k,&n);Matrix pr;pr.h=pr.w=k;CLR(pr.m,0);for(int i=1;i<=k;i++){for(int j=1;j<=k;j++)scanf("%d",&pr.m[i][j]);}Matrix t;t=Quick(pr,n);LL ans=0;for(int i=1;i<=k;i++)ans+=t.m[i][i];printf("%lld\n",ans%MOD);}return 0;}



0 0
原创粉丝点击