Pagini recente » Cod sursa (job #130154) | Cod sursa (job #1669943) | Cod sursa (job #2103415) | Cod sursa (job #1141121) | Cod sursa (job #1561895)
#include <stdio.h>
#include <math.h>
#define MAX_VAL 1000000
#define MAX_P 78500
#define ll long long
int C, D;
char seen[MAX_VAL + 1];
int size, p[MAX_P];
ll int count;
/** Ciurul lui Eratostene. **/
void sieve() {
int i, j, lim = sqrt(C), step;
p[size++] = 2;
for (i = 4; i <= C; i += 2) {
seen[i] = 1;
}
for (i = 3; i <= lim; i += 2) {
if (!seen[i]) {
p[size++] = i;
for (step = (i << 1), j = i * i; j <= C; j += step) {
seen[j] = 1;
}
}
}
for (; i <= C; i += 2) {
if (!seen[i]) {
p[size++] = i;
}
}
}
/** Principiul includerii si al excluderii. **/
void bkt(int level, ll int x, int card) {
ll int mul = x * p[level];
if ((level == size) || (mul > C)) {
if (card & 1) {
count -= (ll)(D / x) * (C / x);
} else {
count += (ll)(D / x) * (C / x);
}
} else {
bkt(level + 1, x, card);
bkt(level + 1, mul, card + 1);
}
}
int main(void) {
FILE *f = fopen("mins.in", "r");
/* Citirea datelor. */
fscanf(f, "%d %d", &C, &D);
fclose(f);
if (C > D) {
int tmp = C;
C = D;
D = tmp;
}
sieve();
/* Calcularea solutiei. */
C--;
D--;
bkt(0, 1, 0);
/* Afisarea solutiei. */
freopen("mins.out", "w", stdout);
fprintf(stdout, "%lld\n", count);
fclose(stdout);
/// Multumim Doamne!
puts("Doamne ajuta!");
return 0;
}