Cod sursa(job #2885262)

Utilizator ptlsebiptl sebi ptlsebi Data 5 aprilie 2022 19:21:32
Problema Mins Scor 95
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <stdint.h>

void read_uint64_t(FILE *__restrict stream, uint64_t *__restrict nr) {
  uint8_t ch;
  *nr = 0;
  while ((ch = fgetc(stream)) && ('0' <= ch && ch <= '9')) {
    *nr *= 10;
    *nr += ch - '0';
  }
  if (ch == '\r') {
    fgetc(stream);
  }
}

uint64_t __inline__ min(uint64_t o1, uint64_t o2) {
  return o1 < o2 ? o1 : o2;
}

uint64_t a[1000001];
uint8_t b[1000001];
uint64_t m;

void mkciur() {
  int64_t i, j;
  for (i = 2; i <= m; ++i) {
    if (a[i] == 0) {
      for (j = i; j <= m; j += i) {
        ++a[j];
      }
      for (j = i * i; j <= m; j += i * i) {
        b[j] = 1;
      }
    }
  }
}

uint64_t c, d;

int main(void) {
  {
    FILE *__restrict in = fopen("mins.in", "r");
  
    read_uint64_t(in, &c);
    read_uint64_t(in, &d);
    --c;
    --d;
  
    fclose(in);
  }

  m = min(c, d);

  mkciur();

  {
    FILE *__restrict out = fopen("mins.out", "w");

    int64_t sum = c * d;
  
    {
      int64_t i;
      for(i = 2; i <= m; ++i) {
        if (b[i] == 0) {
          sum += (1 - 2 * (a[i] & 1)) * (c / i) * (d / i);
        }
      }
    }

    fprintf(out, "%li\n", sum);
  
    fclose(out);
  }

  return 0;
}