Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 99 Accepted Submission(s): 74
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
2 2 2 1 0 0 1 3 99999999 1 2 3 4 5 6 7 8 9
Sample Output
2 2686
Author
xhd
Source
HDU 2007-1 Programming Contest
Recommend
linle
矩阵快速幂的模版题目
需要注意的是需要在矩阵乘法运算过程中每次都模9973,不然会爆int
代码
#include<bits/stdc++.h> using namespace std; int n,k; struct node { int m[12][12]; node(){ memset(m,0,sizeof(m)); } }; int mod=9973; node multi(node &a,node &b) { node tmp; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ int sum=0; for(int k=0;k<n;k++){ sum+=(a.m[i][k]%mod)*(b.m[k][j]%mod); } tmp.m[i][j]=sum%mod; } } return tmp; } void e_mat(node &a) { for(int i=0;i<n;i++){ a.m[i][i]=1; } } node quick_mul(node &a,int n) { node tmp=a; //e_mat(tmp); node res; e_mat(res); if(n&1){ res=a; } n=n>>1; while(n!=0){ tmp=multi(tmp,tmp); if(n&1){ res=multi(res,tmp); } n=n>>1; } return res; } int main() { freopen("data.in","r",stdin); int t; cin>>t; while(t--){ cin>>n>>k; node t,res; for(int i=0;i<n;i++){ for(int j=0;j<n;j++) cin>>t.m[i][j]; } res=quick_mul(t,k); int ans=0; for(int i=0;i<n;i++){ ans+=res.m[i][i]; ans%=mod; } cout<<ans%mod<<endl; } }