Cod sursa(job #1805941)

Utilizator TincaMateiTinca Matei TincaMatei Data 14 noiembrie 2016 18:07:57
Problema Pascal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>

const int MAX_N = 5000000;
const int E2 = 0;
const int E3 = 1;
const int E5 = 2;
struct codeFactory {
  int pr[3];
} prec[1+MAX_N], fi, fj, fij, rez;

void upd(int r, int pr, int poz) {
  int p;
  p = pr;
  while(p <= r) {
    for(int i = p; i <= r; i = i + p)
      prec[i].pr[poz]++;
    p = p * pr;
  }
}

int main() {
  int r, d, nr;
  FILE *fin = fopen("pascal.in", "r");
  fscanf(fin, "%d%d", &r, &d);
  fclose(fin);


  if(d % 2 == 0)
    upd(r, 2, E2);
  if(d % 3 == 0)
    upd(r, 3, E3);
  if(d % 5 == 0)
    upd(r, 5, E5);
  for(int i = 1; i <= r; ++i) {
    prec[i].pr[E2] += prec[i - 1].pr[E2];
    prec[i].pr[E3] += prec[i - 1].pr[E3];
    prec[i].pr[E5] += prec[i - 1].pr[E5];
  }

  bool ok;
  fi = prec[r];
  nr = 0;
  for(int j = 0; j <= r; ++j) {
    fj = prec[j];
    fij = prec[r - j];
    rez.pr[E2] = fi.pr[E2] - fj.pr[E2] - fij.pr[E2];
    rez.pr[E3] = fi.pr[E3] - fj.pr[E3] - fij.pr[E3];
    rez.pr[E5] = fi.pr[E5] - fj.pr[E5] - fij.pr[E5];
    ok = true;
    if(d % 2 == 0 && rez.pr[E2] == 0)
      ok = false;
    if(d % 3 == 0 && rez.pr[E3] == 0)
      ok = false;
    if(d % 5 == 0 && rez.pr[E5] == 0)
      ok = false;
    if(d % 4 == 0 && rez.pr[E2] <= 1)
      ok = false;
    if(ok)
      nr++;
  }

  FILE *fout = fopen("pascal.out", "w");
  fprintf(fout, "%d", nr);
  fclose(fout);
  return 0;
}