Cod sursa(job #789225)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 17 septembrie 2012 17:13:01
Problema Pascal Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream fi("pascal.in");
ofstream fo("pascal.out");

int *dfact;

int compute(int R, int D)
{
  int c = 0, nd;
  for(int i = 0; i < (R + 1) / 2; i++)
  {
    nd = dfact[R] - dfact[R - i] - dfact[i];
    if(nd > 0) c++;
  }
  c *= 2;
  if(R % 2 == 0)
  {
    nd = dfact[R] - dfact[R - R / 2] - dfact[R / 2];
    if(nd > 0) c++;
  }
  return c;
}

int P2[32] = {0};
int P3[32] = {0};
int P5[32] = {0};
void prepow(int d, int r, int *P)
{
  int p = d;
  int i = 0;
  while(p <= r)
  {
    P[i++] = p;
    p *= d;
  }
  i = 0;
}

inline int df(int x, int d, int *P)
{
  int c(0), i(0);
  while(P[i] > 0)
    c += (x / P[i++]);
  return c;
}

inline int max(int a, int b)
{
  if(a > b) return a;
  return b;
}

inline int df(int x, int d)
{
  if(d == 2) return df(x, d, P2);
  if(d == 3) return df(x, d, P3);
  if(d == 4) return df(x, d, P2) / 2;
  if(d == 5) return df(x, d, P5);
  if(d == 6) return max(df(x, d, P2), df(x, d, P3));
  return -1;
}

void pre(int R, int D)
{
  prepow(2, R, P2);
  prepow(3, R, P3);
  prepow(5, R, P5);
  dfact = new int[R + 1];
  for(int i = 0; i <= R; i++)
  {
    dfact[i] = df(i, D);
  }
}

int main(int argc, char *argv[])
{
  int R, D;

  fi >> R >> D;
  pre(R, D);
  fo << compute(R, D) << endl;

  fi.close();
  fo.close();

  return 0;
}