Cod sursa(job #789264)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 17 septembrie 2012 18:32:58
Problema Pascal Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <iostream>

using namespace std;

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

int R, D, *f;

int compute()
{
  int c = 0, lim_sup = (R + 1) / 2;
  for(int i = 0; i < lim_sup; i++)
  {
    if(f[0] > f[i])
      c++;
  }

  c = 2 * c;

  if(R % 2 == 0)
  {
    if(f[0] > f[R / 2])
      c++;
  }

  return c;
}

inline int df2(int x)
{
  return
    x/2 + x/4 + x/8 + x/16 + x/32 + x/64 + x/128 + x/256 + x/512 +
    x/1024 + x/2048 + x/4096 + x/8192 + x/16384 + x/32768 + x/65536 +
    x/131072 + x/262144 + x/524288 + x/1048576 + x/2097152 + x/4194304;

}

inline int df3(int x)
{
  return
    x/3 + x/9 + x/27 + x/81 + x/243 + x/729 + x/2187 + x/6561 + x/19683 +
    x/59049 + x/177147 + x/531441 + x/1594323 + x/4782969;
}

inline int df5(int x)
{
  return
    x/5 + x/25 + x/125 + x/625 + x/3125 + x/15625 + x/78125 + x/390625 +
    x/1953125;
}

void pre2()
{
  int need = (R + 1) / 2;
  for(int i = 0; i <= need; i++)
    f[i] = df2(i) + df2(R - i);
}

void pre3()
{
  int need = (R + 1) / 2;
  for(int i = 0; i <= need; i++)
    f[i] = df3(i) + df3(R - i);
}

void pre5()
{
  int need = (R + 1) / 2;
  for(int i = 0; i <= need; i++)
    f[i] = df5(i) + df5(R - i);
}

void pre()
{
  f = new int[(R + 1) / 2 + 1];
  if(D == 2) pre2();
  else if(D == 3) pre3();
  else if(D == 5) pre5();
  else while(1);
  // else *((int*)0) = 0;
}

int main(int argc, char *argv[])
{
  fi >> R >> D;
  pre();
  fo << compute() << endl;

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

  return 0;
}