Cod sursa(job #2228532)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 4 august 2018 09:55:33
Problema Mins Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <cstdio>

using namespace std;

const int NMAX = 1000000;
int n, m, min,
    nrP = 1, sE,
    p[NMAX+1];
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(x < min) {
            sE++;
            bt(x, i+1);
            sE--;
        }
    }
}

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[i] = 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--;
    min = (m > n) ? n : m;
    ciur(min);

    bt(1, 1);

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