题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575
类型:矩阵快速幂
记得读懂题意
C
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int mod=9973;
int t,n,k;
struct Matrix
{
int a[11][11];
};
Matrix operator * (Matrix a, Matrix b)
{
Matrix tmpans;
memset(tmpans.a,0,sizeof(tmpans.a));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
for(int k=0; k<n; k++)
tmpans.a[i][j]=(tmpans.a[i][j]+a.a[i][k]*b.a[k][j])%mod;
return tmpans;
}
int quick(Matrix a,int k)
{
k--;
Matrix b=a;
while(k)
{
if(k&1)
b=b*a;
a=a*a;
k>>=1;
}
int sum=0;
for(int i=0; i<n; i++)
{
sum+=b.a[i][i];
sum%=mod;
}
return sum;
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
Matrix m;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&m.a[i][j]);
printf("%d\n",quick(m,k));
}
return 0;
}
import java.util.Scanner;
public class Main {
static final int mod=9973;
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
int t=kb.nextInt();
while(t-->0) {
int n=kb.nextInt();
int k=kb.nextInt();
Matrix m=new Matrix(n);
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
m.a[i][j]=kb.nextInt();
}
}
System.out.println(quick(m, k));
}
kb.close();
}
static int quick(Matrix n, int m) {
m--;
Matrix t = new Matrix(n.n);
t.a=n.a;
while (m != 0) {
if ((m & 1) == 1)
t.Multi(n);
n.Multi(n);
m >>= 1;
}
int sum=0;
for(int i=0;i<n.n;i++) {
sum+=t.a[i][i];
sum%=mod;
}
return sum;
}
}
class Matrix {
int a[][];
int n;
private final int mod = 9973;
public Matrix(int n) {
super();
a = new int[n][n];
this.n=n;
}
public void Multi(Matrix m) {
Matrix ans = new Matrix(m.n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int k = 0; k < n; k++) {
ans.a[i][j] = (ans.a[i][j] + a[i][k] * m.a[k][j]) % mod;
}
}
}
a = ans.a;
}
}