莫比乌斯函数解释:

  • n=1n = 1 时,μ(n)=1\mu(n) = 1
  • nnkk 个不同质数的乘积时,μ(n)=(1)k\mu(n) = (-1) ^ k
  • nn 有平方因子时(即存在质数 pp 使得 p2p ^ 2 整除 nn),μ(n)=0\mu(n) = 0

所以,按题意模拟即可。

AC code:

#include <bits/stdc++.h>
using namespace std;

long long mobius_sum(int n) {
    vector<int> mu(n + 1, 0);
    vector<int> primes;
    vector<bool> is_prime(n + 1, true);
    mu[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (is_prime[i]) {
            primes.push_back(i);
            mu[i] = -1;
        }
        for (int p : primes) {
            if (i * p > n) break;
            is_prime[i * p] = false;
            if (i % p == 0) {
                mu[i * p] = 0;
                break;
            } else {
                mu[i * p] = -mu[i];
            }
        }
    }
    long long sum = 0;
    for (int i = 1; i <= n; ++i) {
        sum += mu[i];
    }
    return sum;
}

int main() {
    int n;
    cin >> n;
    long long result = mobius_sum(n);
    cout << result << endl;
    return 0;
}