天天看點

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

題目連結:GCD - Extreme (II) - UVA 11426 - Virtual Judge (vjudge.net)​​​​​

題意

給一個數N,求:

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

其中

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,多組輸入,輸入以0結束,保證答案在long long範圍内。

思路

很好的一道題,值得一刷!!!

看的第一眼确實直接往莫比烏斯反演上想,但其實沒那麼複雜......

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

也即記作:

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

則答案為

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

也即記作: 

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

 是以要先求出

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,那麼即可通過字首和所有的

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,其中

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

那麼怎麼求

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

呢?

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,枚舉因數

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,那麼設共有

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

使得

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,則對答案的貢獻是

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

接下來考慮怎麼求k。由

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

則一定有

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,且滿足

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,即

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

互質。

是以有對任意一個有最大公因數的

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

一定有一對

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

與之對應,而

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

互質,是以根據歐拉函數,這樣的

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

共有

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

 ,則這樣的

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

共有

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,則每對

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

對答案的貢獻是

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

​​​​​​​.

則對于給定的N,歐拉函數

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

可以在

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

的時間複雜度算出來,對枚舉的因數

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

的時間複雜度為

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

​​​​​​​,字首和求出答案的時間複雜度為

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

,故計算答案的時間複雜度為

UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

AcCode

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 4e6 + 5;
int p[N], phi[N], cnt;
bool vis[N];
LL f[N], s[N];

void get_phi() {
  phi[1] = 1;
  for(int i = 2; i < N; i++) {
    if(!vis[i]) {
      p[++cnt] = i;
      phi[i] = i - 1;
    }
    for(int j = 1; j <= cnt && p[j] * i < N; j++) {
      int m = i * p[j];
      vis[m] = 1;
      if(i % p[j] == 0) {
        phi[m] = p[j] * phi[i];
        break;
      } else {
        phi[m] = (p[j] - 1) * phi[i];
      }
    }
  }
}

signed main(){
  get_phi();
  for(int i = 1; i < N; i++){
    for(int j = i * 2; j < N; j += i){
      f[j] += i * phi[j / i];
    }
  }

  for(int i = 1; i < N; i++){
    s[i] = s[i - 1] + f[i];
  }
  
  LL n;
  while(scanf("%lld", &n) && n){
    printf("%lld\n", s[n]);
  }
  
  return 0;
}
           
UVA11426 - GCD - Extreme (II)(數論,歐拉函數)題意思路AcCode

繼續閱讀