第二题是算幂次可能组合的,我一开始写错了,只过了20%,不知道这个对不对
import java.util.Scanner;
/**
* Created by YTY on 2017/9/8.
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long n = Long.parseLong(scanner.nextLine());
System.out.println(resolve(n) % 1000000007L);
}
private static long resolve(long n) {
long result = n * n + (n - 1) * n;//1的幂的所有组合n*n个,2至n的幂的相同次数组合(n - 1) * n个(比如2^1=2^1,2^2=2^2...)
for (long base = 2; base <= n; base++) {//从2开始,1计算过了
long maxBase = base;//记录base的pow次幂
boolean max = false;//记录base的pow次幂是不是已经超过n了
long maxPow = 0;//记录可能的偶数次幂个数
for (long pow = 2; pow <= n; pow++) {//从2开始,1计算过了
maxBase *= base;
if ((pow & 1) == 1) {//奇数次幂
//这边我做的时候写的是result += maxBase <= n ? 1 : 0, 在n>4的情况下是错的,所以只ac20%
result += maxBase <= n ? 2 : 0;////当前幂次没超过n,则maxBase^1=base^pow,反之也算一个,所以加2
} else {//偶数次幂
if (!max) {//当前幂次没超过n,可以试试看还有没有满足的可能
if (maxBase <= n) {//当前幂次没超过n
maxPow++;//可能的偶数次幂个数+1,即(base^maxBase)^2=base^pow
} else {
max = true;//当前幂次超过n,之后不用再统计maxPow了
}
}
result += 2 * maxPow;//对称的也算,所以乘2
}
}
}
return result;
}
}