京東很是精彩的冪數論題目 京東算法題---求冪

//這個纔是正確的代碼
做者:牛妹
連接:https://www.nowcoder.com/discuss/38889?type=0&order=3&pos=6&page=1
來源:牛客網java

 

 

咱們考慮去枚舉n範圍內的全部i,而後處理出i的冪那些數。 這個i就叫作底.code

由於a^b=c^d 那麼必然存在一個i s.t.下面的十字成立.這個證實作因數分解便可.
考慮對於i ^ x, 咱們須要計算知足 (i ^ x) ^ c = (i ^ y) ^ d的數量,其中i ^ x, i ^ y <= n. 這些咱們能夠經過預處理出來。 hash

 


而後對於(i ^ x) ^ c = (i ^ y) ^ d 其實意味着x c = y d, 意味着(x / y) = (d / c),(由於c,d能夠作到互素) 其中x, y咱們能夠在預處理以後枚舉出來,因而咱們就能夠藉此計算出n範圍內有多少不一樣這種c和d去知足等式。
其實就等於 n / max(x / gcd(x, y), y / gcd(x, y)),而後都累加進答案。gcd()表示最大公約數。
中間可能產生重複枚舉,咱們用一個set或者hash容器標記一下就好。class

以上枚舉對於2~sqrt(n)。最後對於大於sqrt(n)的部分,每一個的貢獻都是n。import


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*(2*n-1) % MOD;//以1爲底的個數,這個計算方式是 1.計算1**x=1**y 有n**2個 2.計算x**y=x**y這個有 n**2-n個 減去這個n表示第一種1裏面1爲底的已經算過了.
//3.因此下面討論的狀況是(i ^ x) ^ c = (i ^ y) ^ d且x!=y且i>1 這種狀況.因此i從2取到根號n.容器

    Set<Integer> set  = new HashSet<>();
    for (int i = 2; i*i <= n; i++){ //下面的底至少是2,指數至少也是2,因此i**2<=n
      if ( set.contains(i)) continue;
      long tmp = i;
      int cnt = 0;
 
      while(tmp <= n) {
        set.add((int)tmp);
        tmp = tmp * i;
        cnt++;
      }//好比i取2,n=10的時候,那麼set就是{2,4,8} cnt=3,以後4,8就不用算了,由於他們屬於2這個底
 //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;
//(j / gcd(k, j) )這個操做就是把k,j這個分數變成互素的.
//好比k取1,j取2的時候,ans=ans+10/2*2:由於(i ^ x) ^ c = (i ^ y) ^ d且x!=y且i>1 因此這時也就是 (i ^ 1) ^ c = (i ^ 2) ^ d ,那麼d最高取5個數分別是1到5,由於c<=10
//又如k=2,j=3, (i ^ 2) ^ c = (i ^ 3) ^ d ,那麼d最高取3個分別是2,4,6,由於c<=10
//這個地方爲何這麼計算呢由於k,j互素化以後,爲了乘積xk=jy,那麼x必須是j的倍數,可是x必須小於n
//因此x的取法只有n/j種.(這時j已是(j / gcd(k, j) )了!)
        }
      }
 
    }
 
    System.out.println(ans);
  }
}gc

相關文章
相關標籤/搜索