快速幂 java版

这篇博客介绍了快速幂算法在代数和矩阵运算中的应用,详细阐述了如何利用位运算优化计算过程,达到O(log2n)的时间复杂度。同时,通过实例展示了如何使用矩阵快速幂解决大规模矩阵相乘问题。博客最后提到了类似斐波那契数列的题目,暗示了算法在解决递归问题上的潜力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速幂

代数快速幂

原理: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;
    }

}

题目

类似求斐波那契数列,有时间再写

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值