Cod sursa(job #543474)

Utilizator katakunaCazacu Alexandru katakuna Data 28 februarie 2011 09:07:57
Problema Light2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.89 kb
#include <cstdio>

#define Kmax 24

long long n, sol;
int k, d[Kmax], st[Kmax];

int euclid (long long a, long long b) {

	long long r = a % b;
	while (r) {
		a = b;
		b = r;
		r = a % b;
	}

	return b;
}

void back (int p, long long cmmdc, long long prod) {

	long long cmmmc;

	if (p > 2) cmmmc = prod / cmmdc;
	else cmmmc = cmmdc;

	if (cmmmc > n) return;

	if (p > 1) {
		if ((p-1)&1) sol+= n / cmmmc * ( 1 << (p-2) );
		else sol-= n / cmmmc * ( 1 << (p-2) );
	}

	if (p <= k) {
		for (int i = st[p-1] + 1; i <= k; i++) {
            st[p] = i;

            if (p == 1) back (p + 1, d[i], d[i]);
            else back (p + 1, euclid (cmmmc, d[i]), cmmmc * d[i]);
        }
	}
}

int main () {

	freopen ("light2.in", "r", stdin);
	freopen ("light2.out", "w", stdout);

	scanf ("%lld %d", &n, &k);
	for (int i = 1; i <= k; i++)
		scanf ("%d", &d[i]);

	back (1, 1, 1);

	printf ("%lld", sol);

	return 0;
}