牛客网的题目描述
方法1: 暴力解法
- 运行时间 54 ms
- 占用内存 10924K
- 使用语言 Java
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
while(s.hasNext()){
int n = s.nextInt();// 矩阵大小
int k = s.nextInt();// 指数
int [][] matrix = new int[n][n];
int [][] res = new int[n][n];
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
matrix[i][j] = s.nextInt();// 获得矩阵元素值
res[i][j] = matrix[i][j];
}
for(int i = 0;i < k-1;i++)
pow(n,res,matrix);
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
if(j != n-1)
System.out.print(res[i][j] + " ");
else
System.out.println(res[i][j]);
}
}
s.close();
}
private static void pow(int n,int[][] res, int[][] matrix)
{
int i, j, k;
int [][] tmp = new int[n][n];
for(i=0; i<n; i++)
for(j=0; j<n; j++)
for(k=0; k<n; k++)
tmp[i][j] += res[i][k]*matrix[k][j];
for(i=0; i<n; i++)
for(j=0; j<n; j++)
res[i][j]=tmp[i][j];
}
}
乘法时涉及到三重循环,显然暴力解法的时间复杂度应是O(n^3)。
方法2:快速幂
快速幂(Fast Power)
- 简介:快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
- 实现:
- 运行时间 126 ms
- 占用内存 11148K
- 使用语言 Java
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
while(s.hasNext()){
int n = s.nextInt();// 矩阵大小
int k = s.nextInt();// 指数
int [][] matrix = new int[n][n];
int [][] res = new int[n][n];
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++)
matrix[i][j] = s.nextInt();// 获得矩阵元素值
fastPow(n,res,matrix,k);
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
if(j != n-1)
System.out.print(res[i][j] + " ");
else
System.out.println(res[i][j]);
}
}
s.close();
}
private static void pow(int n,int[][] res, int[][] matrix)
{
int i, j, k;
int [][] tmp = new int[n][n];
for(i=0; i<n; i++)
for(j=0; j<n; j++)
for(k=0; k<n; k++)
tmp[i][j] += res[i][k]*matrix[k][j];
for(i=0; i<n; i++)
for(j=0; j<n; j++)
res[i][j]=tmp[i][j];
}
private static void fastPow(int n,int[][] res, int[][] matrix,int k){// 快速幂
for(int i=0;i<n;i++)
res[i][i]=1;
while(k != 0){
if(k % 2 == 1){
pow(n,res,matrix);
}
pow(n,matrix,matrix);
k = k >> 1;
}
}
}