比赛 2025.5.4 评测结果 AAAAAAAAAA
题目名称 GCD 最终得分 100
用户昵称 健康铀 运行时间 0.595 s
代码语言 C++ 内存使用 38.78 MiB
提交时间 2025-05-04 11:56:55
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e7 + 10;
long long m[MAXN];
vector<int> ps;
bool ic[MAXN];
long long mp[MAXN];

void sv(int n) {
    fill(ic, ic + n + 1, 0);
    m[1] = 1;
    for (int i = 2; i <= n; ++i) {
        if (!ic[i]) ps.push_back(i), m[i] = -1;
        for (int q : ps) {
            int j = i * q;
            if (j > n) break;
            ic[j] = 1;
            if (i % q == 0) { m[j] = 0; break; }
            else m[j] = m[i] * m[q];
        }
    }
}

long long cal(int k) {
    long long s = 0;
    for (int l = 1, r, v; l <= k; l = r + 1) {
        v = k / l, r = k / v;
        s += 1LL * v * v * (mp[r] - mp[l-1]);
    }
    return s;
}

int main() {
	freopen("gcd_prime.in","r",stdin);
		freopen("gcd_prime.out","w",stdout);
    int N; cin >> N; sv(N);
    for (int i = 1; i <= N; ++i) mp[i] = mp[i-1] + m[i];
    long long ans = 0;
    for (int p : ps) if (p <= N) ans += cal(N/p);
    cout << ans;
}