HDOJ 1575 Tr A (矩阵快速幂)

来源:互联网 发布:mac cocos2dx android 编辑:程序博客网 时间:2024/05/09 20:21

Tr A

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


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
2
2686


题意:中文题目

思路:裸的矩阵快速幂,注意中间的取余就行了。

ac代码:
#include<stdio.h>#include<math.h>#include<string.h>#include<stack>#include<queue>#include<vector>#include<iostream>#include<algorithm>#define MAXN 101000#define LL long long#define ll __int64#define INF 0xfffffff#define mem(x) memset(x,0,sizeof(x))#define PI acos(-1)using namespace std;int ans[10][10];int a[10][10];void Matrix(int A[10][10],int B[10][10],int n){int T[10][10];mem(T);for(int i=0;i<n;i++){for(int j=0;j<n;j++){for(int k=0;k<n;k++){T[i][j]=(T[i][j]+A[i][k]*B[k][j])%9973;}}}for(int i=0;i<n;i++){for(int j=0;j<n;j++){A[i][j]=T[i][j];}}}void Matrixpow(int A[10][10],int n,int m){mem(ans);for(int i=0;i<n;i++)ans[i][i]=1;while(m){if(m%2)Matrix(ans,A,n);Matrix(A,A,n);m/=2;}}int main(){int num,i,j,n,k;int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&k);mem(a);for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%d",&a[i][j]);}}Matrixpow(a,n,k);int sum=0;for(i=0;i<n;i++)sum=(sum+ans[i][i])%9973;printf("%d\n",sum);}return 0;}


0 0
原创粉丝点击