东东对幂运算很感兴趣,在学习的过程中东东发现了一些有趣的性质: 9^3 = 27^2, 2^10 = 32^2
东东对这个性质充满了好奇,东东现在给出一个整数n,希望你能帮助他求出满足 a^b = c^d(1 ≤ a,b,c,d ≤ n)的式子有多少个。
例如当n = 2: 1^1=1^1
1^1=1^2
1^2=1^1
1^2=1^2
2^1=2^1
2^2=2^2
一共有6个满足要求的式子
输入包括一个整数n(1 ≤ n ≤ 10^6)
输出一个整数,表示满足要求的式子个数。因为答案可能很大,输出对1000000007求模的结果
2
6
照 北交大李国杰 同学答案改的py3版本,通过率90%,感觉是python数值计算精度的问题导致的计算错误; 希望解决了这个问题的同学指教 import math def gcd(a,b): a,b=min(a,b),max(a,b) for i in range(1,a+1): if a%i==0 and b%i==0: cd=i return cd n=int(input()) mode=int(1e9+7) rec=[0]*(n+1)#record list res=n*(2*n-1)%mode for i in range(2,n+1): if rec[i]: continue rec[i]=1 lgn=math.floor(math.log(n,i)) for lga in range(1,lgn): rec[i**lga]=1 for lgc in range(lga+1,lgn+1): res+=(n//(lgc//gcd(lga,lgc))*2) res=res%mode print(res)
import math n=int(input()) count=0 for i in range(1,n+1): for j in range(1,n+1): for k in range(1,n+1): if math.pow(i**j,1/k) in range(1,n+1): count=count+1 print(count)
# 回复 spMoon # 非常感谢你将java改成python3版本 # 我是基本照抄你的代码,懒得大改,然后修改了一点点 # 你的代码用的是math.floor取整,而北交大李国杰同学用的是round取整,这就是你俩不一致的地方,修改后准确率达到100% import math def gcd(a,b): a,b=min(a,b),max(a,b) for i in range(1,a+1): if a%i==0 and b%i==0: cd=i return cd n=int(input()) mode=int(1e9+7) rec=[0]*(n+1) res=n*(2*n-1)%mode for i in range(2,n+1): if rec[i]: continue else: rec[i]=1 lgn=round(math.log(n,i)) if pow(i,lgn)>n: lgn = lgn-1 for lga in range(1,lgn): rec[i**lga]=1 for lgc in range(lga+1,lgn+1): res+=(n//(lgc//gcd(lga,lgc))*2) res=res%mode print(res)
import java.util.*; public class Main { public static void main(String args[]) { Scanner in = new Scanner(System.in); int n = in.nextInt(); long out = 0; int[] already = new int[n + 1]; out += ((long)n) * n; // a=c=1 out += ((long)n) * (n - 1);// a=c!=1时 for (int i = 2; i <= n; i++)// 底数遍历 { if (already[i] == 0) {//算过的就不用算了 long counti = 0; int logn = (int) Math.round(Math.log(n) / Math.log(i));// log以i为底 可能有舍入误差 if (Math.pow(i, logn) > n) logn--; for (int loga = 1; loga <= logn; loga++) { for (int logc = 1; logc <= logn; logc++) { if (loga != logc) { int comFactor = 1;// 最大公因数 int smaller = loga > logc ? logc : loga; int bigger = loga < logc ? logc : loga; for (int com = 1; com <= smaller; com++) { if (loga % com == 0 && logc % com == 0) { comFactor = com; } } counti += (n / (bigger / comFactor)); } } already[(int) Math.pow(i, loga)] = 1; } out += counti; } } System.out.println(out % 1000000007L); } }//在答题区看到了更好的答案 留给大家研究研究import java.util.HashSet; import java.util.Scanner; import java.util.Set; public class Main { public final static long MOD = 1000000000 + 7; public static int max(int a, int b){ return (a>b) ? a : b; } public static long gcd(long a,long b){ return (a % b == 0) ? b : gcd(b,a%b); } public static void main(String[] args) { Scanner in = new Scanner(System.in); long n = in.nextInt(); long ans = (long)1*n*(n*2-1) % MOD; Set<Integer> set = new HashSet<>(); for (int i = 2; i*i <= n; i++){ if ( set.contains(i)) continue; long tmp = i; int cnt = 0; while(tmp <= n) { set.add((int)tmp); tmp = tmp * i; cnt++; } for(int k = 1; k <= cnt; k++) { for(int j = k + 1; j <= cnt; j++) { ans = (ans + n / (j / gcd(k, j) ) * (long)2 ) % MOD; } } } System.out.println(ans); } }
importmath
if__name__=='__main__':N=raw_input()N=int(N)NUM=dict()D=dict()for k in range(2,N+1):for i in range(1,N+1):m=pow(k,i)if m not in D:D[m]=1NUM[m]=pow(D[m],2)else:D[m]=D[m]+1NUM[m]=pow(D[m],2)del mprint(sum(NUM.values())+N*N)%1000000007