思路:快速幂 + 高精数
快速幂见前帖
注意运算过程中只保留后500位,否则会MLE。 ANS MOD 10^500
求2^P - 1的位数: N = floor(log10(2^n) + 1) = floor(n * log10(2)) + 1)
Code:
import java.util.Scanner;
import java.util.*;
import java.io.*;
import java.math.*;
public class Main {
public static void main(String args[]) {
PrintWriter pr = new PrintWriter(new OutputStreamWriter(System.out));
Scanner sc = new Scanner(System.in);
int p = sc.nextInt();
BigInteger a = BigInteger.valueOf(2);
BigInteger ans = BigInteger.valueOf(1);
BigInteger cst = BigInteger.TEN.pow(500);
pr.println((int) ((Math.log10(2) * p) + 1));
while (p > 0) {
if ((p & 1) == 1) {
ans = ans.multiply(a);
ans = ans.mod(cst);
p = p >> 1;
a = a.multiply(a);
}else {
p = p >> 1;
a = a.multiply(a);
}
}
ans = ans.subtract(BigInteger.valueOf(1));
String strAns = ans.toString();
if (strAns.length() < 500) {
int cpl = 500 - strAns.length();
for (int i = 0; i < cpl; i++) {
strAns = "0" + strAns;
}
for (int j = 0; j < 10; j++) {
for (int k = j * 50; k < j * 50 + 50; k++) {
pr.printf("%c", strAns.charAt(k));
}
pr.println();
}
}else {
for (int j = 0; j < 10; j++) {
for (int k = j * 50; k < j * 50 + 50; k++) {
pr.printf("%c", strAns.charAt(k));
}
pr.println();
}
}
sc.close();
pr.flush();
}
}