1. 程式人生 > 其它 >洛谷P1045 [NOIP2003 普及組] 麥森數--Java使用快速冪

洛谷P1045 [NOIP2003 普及組] 麥森數--Java使用快速冪

技術標籤:洛谷Java解法

洛谷P1045 [NOIP2003 普及組] 麥森數–Java使用快速冪

題目連結

基本思路

通過使用快速冪取模節省運算時間,然後使用大數類保證高精度

程式碼

import java.math.BigInteger;
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		System.out.println((int)(n*Math.log10
(2))+1); //計算麥森數後500位 BigInteger big=pow(BigInteger.valueOf(2),n); big=big.subtract(BigInteger.ONE); String s=big.toString(); while(s.length()<500) { s="0"+s; } s=s.substring(s.length()-500,s.length()); int start=0; for(int i=0;i<10;i++) { if(i==9) System.out.print(s.substring
(start,start+50)); else System.out.println(s.substring(start,start+50)); start+=50; } sc.close(); return; } // 快速冪實現 public static BigInteger pow(BigInteger big,int n) { BigInteger mod=BigInteger.TEN.pow(500); BigInteger res=BigInteger.ONE; while(n!=0) { if((n&1)==1) res=res.multiply
(big).mod(mod); big=big.multiply(big).mod(mod); n=n>>1; } return res; } }

其中,快速冪還有一種寫法,這種方法是先將指數二進位制未處的1省去,似乎可以加快部分時間,但效果基本上不明顯,不太推薦這種寫法

public static BigInteger pow(BigInteger big,int n) {
		BigInteger mod=BigInteger.TEN.pow(500);
		if(n==0) return BigInteger.ZERO;
		else {
			while((n&1)==0) {
				big=big.multiply(big).mod(mod);
				n=n>>1;
			}
		}
		BigInteger res=BigInteger.ONE;
		res=res.multiply(big).mod(mod);
		n=n>>1;
		while(n!=0) {
			big=big.multiply(big).mod(mod);
			if((n&1)==1) res=res.multiply(big).mod(mod);
			n=n>>1;
		}
		return res.mod(mod);
	}