Cod sursa(job #2228534)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 4 august 2018 10:05:29
Problema Mins Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <cstdio>

using namespace std;

const int NMAX = 1000000,
          PMAX = 78498;
int n, m, minn,
    nrP = 1, sE,
    p[PMAX+2];
char b[NMAX+1];
long long cnt;

void bt(int v, int pr) {
    if(sE % 2 == 1) cnt -= (long long)(n/v) * (m/v);
    else cnt += (long long)(n/v) * (m/v);

    for(int i = pr; i <= nrP; i++) {
        int x = v * p[i];
        if((long long)x < minn) {
            sE++;
            bt(x, i+1);
            sE--;
        } else return;
    }
}

void ciur(int x) {
    for(int i = 4; i <= x; i += 2)
        b[i] = 1;
    for(int i = 3; i * i <= x; i += 2)
        if(b[i] == 0)
            for(int j = i*i; j <= x; j += i)
                b[j] = 1;
    p[1] = 2;
    for(int i = 3; i <= x; i += 2)
        if(b[i] == 0) p[++nrP] = i;
}

int main()
{
    freopen("mins.in", "r", stdin);
    freopen("mins.out", "w", stdout);

    scanf("%i %i", &n, &m);

    n--, m--;
    minn = (m > n) ? n : m;
    ciur(minn);

    bt(1, 1);

    printf("%lld", cnt);
    return 0;
}