Cod sursa(job #3340344)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 13 februarie 2026 19:17:54
Problema Mins Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <bits/stdc++.h>
#define ll long long

using namespace std;

ifstream fin("mins.in");
ofstream fout("mins.out");

const int NMAX = 1e6;

int n, m;
int last_prime[NMAX + 1];
ll answer;

void eratostene() {
    for(int i = 2; i <= NMAX; i++) {
        if(!last_prime[i]) {
            for(int j = i; j <= NMAX; j += i) {
                last_prime[j] = i;
            }
        }
    }
}

ll ired(int x) {
    vector<int> factors;
    int cx = x;
    while(x > 1) {
        int d = last_prime[x];
        factors.push_back(d);
        while(x % d == 0) {
            x /= d;
        }
    }
    x = cx;

    int sz = factors.size();
    ll answer = m;
    for(int mask = 1; mask < (1 << sz); mask++) {
        ll prod = 1;
        for(int i = 0; i < sz; i++) {
            if(mask >> i & 1) {
                prod *= factors[i];
            }
        }

        int sign = (__builtin_popcount(mask) % 2 == 1 ? -1 : 1);
        answer += sign * m / prod;
    }
//    cout << x << ' ' << answer << '\n';
    return answer;
}

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    eratostene();

    fin >> n >> m;
    n--; m--;
    for(int x = 1; x <= n; x++) {
        answer += ired(x);
    }
    fout << answer << '\n';
    return 0;
}