Cod sursa(job #543928)

Utilizator savimSerban Andrei Stan savim Data 28 februarie 2011 19:27:32
Problema Light2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <stdio.h>
#include <algorithm>

using namespace std;

#define MAX_K 25
#define inf 10000000000000LL

long long n, sol;
int k;
int A[MAX_K];

long long state[2097152];

inline long long cmmdc(long long a, long long b) {
	long long r = 0;

	while (a % b != 0) {
    	r = a % b;
		a = b;
		b = r;
	}

	return b;
}

inline long long cmmmc(long long x, int y) {
	if (x == inf || y == inf)
		return inf;

	long long val = 1LL * x * y;
    val = val / cmmdc(x, y); 

	if (val > n)
		return inf;
	return val;
}

inline int lsb(int x) {
	return x ^ (x & (x - 1));
}

void solve() {
	state[0] = 1;

	for (int i = 1; i < (1 << k); i++) {
		long long val = 1;

		for (int j = k - 1; j >= 0; j--)
			if (i & (1 << j)) {
            	val = cmmmc(state[i - (1 << j)], A[j + 1]);
				break;
			}
		if ((i & (1 << (k - 1))) == 0)
			state[i] = val;

		int nr = 0, aux = i;
		while (aux) {
        	aux -= lsb(aux);
			nr++;
		}

		if (nr % 2 == 1)
			sol = sol + 1LL * (1 << (nr - 1)) * (n / val);
		else
			sol = sol - 1LL * (1 << (nr - 1)) * (n / val);
	}

	printf("%lld\n", sol);
}

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", &A[i]);

	solve();

	return 0;
}