Cod sursa(job #2915628)

Utilizator euyoTukanul euyo Data 23 iulie 2022 19:21:17
Problema Factoriale Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin( "factoriale.in" );
ofstream fout( "factoriale.out" );

const int DIM = 105;
const int MAXD = 10005; 

int x[DIM], ciur[DIM];

vector<pair<int, int>> mult;

struct large {
  int nd, d[MAXD];

  large operator * ( const int &a ) {
    large res;
	res.init();
    int tr = 0, n = this -> nd;
    
    int i;
    for ( i = 1; i <= n || tr > 0; ++i ) {
      tr += a * (this -> d[i]);
      res.d[i] = tr % 10;
      tr /= 10;
    }
    if ( i > n ) {
      res.nd = --i;
    } else {
      res.nd = n;
    }
    return res;
  }

  void print() {
    for ( int i = (this -> nd); i >= 1; --i ) {
      fout << this -> d[i];
    }
    fout << "\n";
  }
  void init() {
	for ( int i = 0; i < MAXD; ++i ) {
	  this -> d[i] = 0;  
	}
	this -> nd = 0;
  }
};

int main() {
  int n, k, mx = 0;

  fin >> n >> k;
  for ( int i = 1; i <= n; ++i ) {
	fin >> x[i];
	mx = max(mx, x[i]);
  }
  for ( int d = 2; d <= mx; ++d ) {
	if ( !ciur[d] ) {
	  int t = 0;
	  for ( int i = 1; i <= n; ++i ) {
		int p = d;
		while ( p <= x[i] ) {
		  t += x[i] / p;
		  p *= d;
		}
	  }
      mult.push_back( {d, (t % k == 0 ? 0 : k - t % k)} );
	  for ( int i = d + d; i <= mx; ++i ) {
		ciur[i] = 1;
	  }
	}
  }
  large res;
  res.init(), res.nd = res.d[1] = 1;
  for ( auto &e : mult ) {
	while ( e.second-- ) {
	  res = res * e.first;
	}
  }
  res.print();
  fin.close();
  fout.close();
  return 0;
}