快速幂
代数快速幂
原理:xn 如果n是偶数可以变成(x2)n/2 此时O(n)
⟶
\longrightarrow
⟶O(n/2)
如果n为奇数xn
⟶
\longrightarrow
⟶x
⋅
\cdot
⋅(x2)(n-1)/2
最后的复杂度就是O(log2n)
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
long n=in.nextLong();
long m=in.nextLong();
long p=in.nextLong();
System.out.println(mi(n,m,p));
}
/**
* n是底
* m是幂
* 结果模p
* */
static long mi(long n,long m,long p){
long res=1;
long base=n;
while(m>0){
//等价于m%2==1
if((m&1)==1){
res=(res%p)*(base%p)%p;
}
base=(base%p)*(base%p)%p;
//等价于m=m/2
m=m>>1;
}
return res%p;
}
}
矩阵快速幂
其实同理,就是将代数的乘改成矩阵的乘
import java.util.Scanner;
public class Main{
static class Matrix{
long[][] matrix;
public Matrix(int n){
matrix=new long[n][n];
for(int i=0;i<n;i++)
matrix[i][i]=1;
}
//必须是同n阶矩阵
}
static Matrix multiMatrix(Matrix A,Matrix B){
int n=B.matrix.length;
Matrix res=new Matrix(n);
//[i,j]的值为[i,k]*[k,j]
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
int num=0;
for(int k=0;k<n;k++){
num+=A.matrix[i][k]*B.matrix[k][j];
}
res.matrix[i][j]=num;
}
}
return res;
}
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int m=in.nextInt();
Matrix A=new Matrix(n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
A.matrix[i][j]=in.nextInt();
}
}
A=mi(A,m);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(A.matrix[i][j]+" ");
}
System.out.println();
}
}
/**
* n是底
* m是幂
* */
static Matrix mi(Matrix A,int m){
//单位矩阵
Matrix res=new Matrix(A.matrix.length);
Matrix base=A;
while(m>0){
//等价于m%2==1
if((m&1)==1){
res=multiMatrix(res,base);
}
base=multiMatrix(base,base);
//等价于m=m/2
m=m>>1;
}
return res;
}
}
题目
类似求斐波那契数列,有时间再写
这篇博客介绍了快速幂算法在代数和矩阵运算中的应用,详细阐述了如何利用位运算优化计算过程,达到O(log2n)的时间复杂度。同时,通过实例展示了如何使用矩阵快速幂解决大规模矩阵相乘问题。博客最后提到了类似斐波那契数列的题目,暗示了算法在解决递归问题上的潜力。

494

被折叠的 条评论
为什么被折叠?



