java BigInteger 大数版矩阵快速幂模板

本文介绍了一种使用Java实现的矩阵乘法和矩阵幂运算的方法,特别关注于处理大数值运算,通过预定义BigInteger变量提高效率。文章详细解释了如何通过循环和位操作进行矩阵的快速幂运算,以及如何打印运算结果。

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

import java.math.*;
import java.util.*;
 
public class Main {
    public static BigInteger __ng=BigInteger.valueOf(-1);
    public static BigInteger __0=BigInteger.valueOf(0);
    public static BigInteger __1=BigInteger.valueOf(1);
    public static BigInteger __2=BigInteger.valueOf(2);
    public static BigInteger __3=BigInteger.valueOf(3);
    public static BigInteger __4=BigInteger.valueOf(4);
    public static BigInteger __5=BigInteger.valueOf(5);
    public static BigInteger __6=BigInteger.valueOf(6);
    public static BigInteger __7=BigInteger.valueOf(7);
    public static BigInteger __8=BigInteger.valueOf(8);
    public static BigInteger __9=BigInteger.valueOf(9);
    public static BigInteger __10=BigInteger.valueOf(10);
    public static BigInteger __100=BigInteger.valueOf(100);
    public static BigInteger __10000=BigInteger.valueOf(10000);
    public static int siz=3;
    
    public static void Mul(BigInteger[][] a,BigInteger[][] b) { // a = a*b
    	BigInteger[][] res=
        				{{__0,__0,__0},{__0,__0,__0},{__0,__0,__0}};
    	for(int i=0;i<siz;i++) {
    		for(int j=0;j<siz;j++) {
    			for(int k=0;k<siz;k++) {
    				res[i][j]=res[i][j].add(a[i][k].multiply(b[k][j]));
    			}
    		}
    	}
    	for(int i=0;i<siz;i++) {
    		for(int j=0;j<siz;j++) {
    			a[i][j]=res[i][j];
    		}
    	}
    }
    
    public static void Pow(BigInteger[][] a,long b) { // a = a^b
    	BigInteger[][] res= new BigInteger[][]{{__1,__0,__0},{__0,__1,__0},{__0,__0,__1}};
    	while(b>0) {
    		if((b&1)>0) {
    			Mul(res,a);
    		}
    		b>>=1;
    		Mul(a,a);
    	}
    	for(int i=0;i<siz;i++) {
    		for(int j=0;j<siz;j++) {
    			a[i][j]=res[i][j];
    		}
    	}
    }
    
    public static void Print(BigInteger[][] a) { // print martix
    	System.out.println("__________________________________out");
    	for(int i=0;i<siz;i++) {
    		for(int j=0;j<siz;j++) {
    	    	System.out.print(a[i][j]+" ");
    		}
	    	System.out.println();
    	}
    	System.out.println();
    }
    
    public static void main(String args[]) {
        Scanner cin=new Scanner(System.in);
        int t=cin.nextInt();
        int cas=0;while(t-->0) {
        	long n=cin.nextLong();
        	BigInteger[][] ans=
            		{{__1,__1,__1},{__0,__0,__0},{__0,__0,__0}};
        	BigInteger[][] tmp=
            		{{__1,__0,__0},{__10.add(__6),__1,__0},{__1.subtract(__10.add(__6)),__1,__1}};
        	Pow(tmp,n);
        	Print(tmp);
        	Mul(ans,tmp);
        	Print(ans);
        	System.out.println("Case #"+(++cas)+": "+ans[0][0]);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值