Pagini recente » Cod sursa (job #1767110) | Cod sursa (job #1856559) | Cod sursa (job #1344814) | Monitorul de evaluare | Cod sursa (job #543928)
Cod sursa(job #543928)
#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;
}