莫比乌斯板子求助
  • 板块学术版
  • 楼主optimize_2
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/8/16 19:55
  • 上次更新2023/11/4 10:26:19
查看原帖
莫比乌斯板子求助
224978
optimize_2楼主2021/8/16 19:55

i ∈ [1, n]

i ∈ [1, m]

求 [(i, j) = 1] 的和

#include <bits/stdc++.h>
#define N 100010
typedef long long ll;
using namespace std;

int p[N], mu[N], cnt;
bool v[N];
int sum[N];

void init() {
    v[1] = mu[1] = 1;
    for (int i = 2; i <= N; i++) {
        if (!v[i]) {
            cnt++;
            p[cnt] = i;
            mu[i] = -1;
        }
        for (int j = 1; j <= cnt; j++) {
            if (i * p[j] > N) break;
            v[i * p[j]] = 1;
            mu[i * p[j]] = (i % p[j] == 0) ? (0) : (-mu[i]);
            if (i % p[j]) break;
        }
    }
}

ll calc(ll n, ll m) {
    ll ans = 0;
    for (int l = 1, r = 0; l <= min(n, m); l = r + 1) {
        r = min(n / (n / l), (m / (m / l)));
        ans += 1ll * (sum[r] - sum[l - 1]) * (n / l) * (m / l);
    }
    return ans;
}

int main() {
    init();
    for (int i = 1; i <= N; i++)
        sum[i] = sum[i - 1] + mu[i];
    ll n, m;
    cin >> n >> m;
    cout << calc(n, m);
}
2021/8/16 19:55
加载中...