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

相关推荐

有担当的灰太狼又在摸鱼:零帧起手查看图片
点赞 评论 收藏
分享
牛客网
牛客企业服务