洛谷P1045 [NOIP2003 普及組] 麥森數--Java使用快速冪
阿新 • • 發佈:2021-01-27
技術標籤:洛谷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);
}