第二题是算幂次可能组合的,我一开始写错了,只过了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;
    }


}