Cod sursa(job #1561895)

Utilizator stoianmihailStoian Mihail stoianmihail Data 4 ianuarie 2016 17:35:40
Problema Mins Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.34 kb
#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;
}