Cod sursa(job #1805962)

Utilizator TincaMateiTinca Matei TincaMatei Data 14 noiembrie 2016 18:30:37
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <cstdio>

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

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

  for(int i = 1; i <= r; ++i) {
    if(i % 2 == 0)
      prim[i].v[0] = prim[i / 2].v[0] + 1;
    if(i % 3 == 0)
      prim[i].v[1] = prim[i / 3].v[1] + 1;
    if(i % 5 == 0)
      prim[i].v[2] = prim[i / 5].v[2] + 1;
    prec[i].v[0] += prec[i - 1].v[0] + prim[i].v[0];
    prec[i].v[1] += prec[i - 1].v[1] + prim[i].v[1];
    prec[i].v[2] += prec[i - 1].v[2] + prim[i].v[2];
  }

  bool ok, rep;
  fi = prec[r];
  nr = 0;
  rep = false;
  for(int j = 0; j <= r / 2; ++j) {
    fj = prec[j];
    fij = prec[r - j];
    rez.v[E2] = fi.v[E2] - fj.v[E2] - fij.v[E2];
    rez.v[E3] = fi.v[E3] - fj.v[E3] - fij.v[E3];
    rez.v[E5] = fi.v[E5] - fj.v[E5] - fij.v[E5];
    switch(d) {
      case 2: {
        ok = rez.v[E2] > 0;
        break;
      }
      case 3: {
        ok = rez.v[E3] > 0;
        break;
      }
      case 4: {
        ok = rez.v[E2] > 1;
        break;
      }
      case 5: {
        ok = rez.v[E5] > 0;
        break;
      }
      case 6: {
        ok = rez.v[E2] > 0 && rez.v[E3] > 0;
        break;
      }
    }
    if(ok) {
      nr++;
      if(j == r - j)
        rep = true;
    }
  }
  FILE *fout = fopen("pascal.out", "w");
  fprintf(fout, "%d", 2 * nr - rep);
  fclose(fout);
  return 0;
}