Pagini recente » Cod sursa (job #161276) | Tudorica | Filme | Cod sursa (job #1136448) | Cod sursa (job #541503)
Cod sursa(job #541503)
#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;
}