Cod sursa(job #541503)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 25 februarie 2011 11:47:57
Problema Light2 Scor Ascuns
Compilator cpp Status done
Runda Marime 1.11 kb
#include <cstdio>
#include <cassert>

using namespace std;

#define LL long long
#define MAXN 1000000000000LL
#define MAXK 22

LL N, Nleft;
int K;
int d[MAXK];

inline LL gcd(LL A, LL B) {
    LL C;
    while (B) {
        C = A % B;
        A = B;
        B = C;
    }
    return A;
}

void back(int lvl, LL prod, int cnt) {
    if (prod > N) {
        return;
    }

    if (lvl == K) {
        if (cnt % 2 == 1) {
            Nleft += (N / prod) * cnt;
        } else {
            Nleft -= (N / prod) * cnt;
        }
        return;
    }

    back(lvl + 1, prod, cnt);
    back(lvl + 1, prod * d[lvl] / gcd(prod, d[lvl]), cnt + 1);
}

int main() {
    assert(freopen("light2.in", "rt", stdin));
#ifndef DEBUG
    assert(freopen("light2.out", "wt", stdout));
#endif

    assert(scanf("%lld", &N) == 1);
    assert(3 <= N && N <= MAXN);
    assert(scanf("%d", &K) == 1);
    assert(1 <= K && K <= MAXK);
    for (int i = 0; i < K; i++) {
        assert(scanf("%d", d + i) == 1);
        assert(1 <= d[i] && d[i] <= 1000000 && d[i] <= N);
    }

    Nleft = 0;
    back(0, 1, 0);
    printf("%lld\n", N - Nleft);

    return 0;
}