Cod sursa(job #1263688)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 15 noiembrie 2014 01:09:26
Problema Pascal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <iostream>
#include <fstream>

inline int getpowf(int r, int base) {
  int sol = 0;
  for (int i = r / base; i; i /= base) {
    sol += i;
  }
  return sol;
}

inline int getpow(int n, int base) {
  int sol = 0;
  for (; n % base == 0; n /= base) {
    sol++;
  }
  return sol;
}

int main()
{
  std::ifstream in("pascal.in");
  std::ofstream out("pascal.out");

  int r, d;
  in >> r >> d;
  int pow2num = getpowf(r, 2);
  int pow3num = getpowf(r, 3);
  int pow5num = getpowf(r, 5);
  int pow2den = pow2num;
  int pow3den = pow3num;
  int pow5den = pow5num;
  int sol = 0;
  for (int j = 1; j <= r / 2; ++j) {
    // Adding in j, taking out (r - j + 1).
    pow2den = pow2den + getpow(j, 2) - getpow(r - j + 1, 2);
    pow3den = pow3den + getpow(j, 3) - getpow(r - j + 1, 3);
    pow5den = pow5den + getpow(j, 5) - getpow(r - j + 1, 5);
    switch (d) {
      case 2: if (pow2num - pow2den > 0) sol++; break;
      case 3: if (pow3num - pow3den > 0) sol++; break;
      case 4: if (pow2num - pow2den > 1) sol++; break;
      case 5: if (pow5num - pow5den > 0) sol++; break;
      case 6: if (pow2num - pow2den > 0 && pow3num - pow3den > 0) sol++; break;
    }
  }
  sol = (r % 2 == 0 ? (sol - 1) * 2 + 1 : sol * 2);

  out << sol << std::endl;

  in.close();
  out.close();

  return 0;
}