Cod sursa(job #2100889)

Utilizator DruffbaumPopescu Vlad Druffbaum Data 6 ianuarie 2018 15:31:32
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>

const int MAXN = 1e2;
const int MAXF = 1e5;

int p[MAXN + 1], v[MAXF + 1], e[MAXN + 1]; 
bool ciur[MAXN + 1];

void mult(int x) {
  int i = 1, t = 0;
  while (i <= v[0] || t > 0) {
    t += v[i] * x;
    v[i++] = t % 10;
    t /= 10;
  }
  v[0] = i - 1;
}

int main() {
  int n, k, m, x, y;
  FILE *f = fopen("factoriale.in", "r");
  fscanf(f, "%d%d", &n, &k);
  for (int i = 2; i * i <= MAXN; ++i) {
    if (!ciur[i]) {
      for (int j = i * i; j <= MAXN; j += i) {
        ciur[j] = 1;
      }
    }
  }
  m = 0;
  for (int i = 2; i <= MAXN; ++i) {
    if (!ciur[i]) {
      p[m++] = i;
    }
  }
  for (int i = 0; i < n; ++i) {
    fscanf(f, "%d", &x);
    for (int j = 0; j < m; ++j) {
      y = p[j];
      while (y <= x) {
        e[j] += x / y;
        y *= p[j];
      }
    }
  }
  fclose(f);
  v[0] = v[1] = 1;
  for (int i = 0; i < m; ++i) {
    if (e[i] % k) {
      x = k - e[i] % k;
      for (int j = 0; j < x; ++j) {
        mult(p[i]);
      }
    }
  }
  f = fopen("factoriale.out", "w");
  for (int i = v[0]; i > 0; --i) {
    fprintf(f, "%d", v[i]);
  }
  fclose(f);
  return 0;
}