Cod sursa(job #1355871)

Utilizator iordache.bogdanIordache Ioan-Bogdan iordache.bogdan Data 22 februarie 2015 23:47:41
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <fstream>
#include <algorithm>

#define DIM 101
#define LEN 100000
#define infile "factoriale.in"
#define outfile "factoriale.out"

using namespace std;

ifstream f(infile);
ofstream g(outfile);

bool ok[DIM];

int primes[DIM], exponents[DIM];

int res[LEN], aux[LEN], tmp[LEN];

void atrib(int A[], int B[]) {
	A[0] = B[0];
	for (int i = 1; i <= A[0]; ++i)
		A[i] = B[i];
}

void multiply(int A[], int B[], int C[]) {
	int t = 0;
	C[0] = A[0] + B[0] - 1;
	for (int i = 1; i <= A[0] + B[0]; ++i)
		C[i] = 0;
	for (int i = 1; i <= A[0]; i++)
		for (int j = 1; j <= B[0]; j++)
			C[i + j - 1] += A[i] * B[j];
	for (int i = 1; i <= C[0]; i++)
	{
		t = (C[i] += t) / 10;
		C[i] %= 10;
	}
	if (t)
		C[++C[0]] = t;
}

int main() {

	int n, k;

	f >> n >> k;

	int primesCount = 0;

	for (int i = 2; i < DIM; ++i) {

		if (ok[i] == 1)
			continue;

		primes[++primesCount] = i;

		for (int j = i + i; j < DIM; j += i)
			ok[j] = 1;

	}

	for (int i = 1; i <= n; ++i) {

		int val;

		f >> val;

		for (int j = 1; j <= primesCount; ++j) {

			for (int temp = primes[j]; temp <= val; temp *= primes[j])
				exponents[j] += val / temp;

		}

	}

	res[0] = res[1] = 1;

	for (int i = 1; i <= primesCount; ++i) {

		if (exponents[i] % k == 0)
			continue;

		for (int j = 1; j <= k - exponents[i] % k; ++j) {

			if (primes[i] / 10)
				aux[0] = 2, aux[1] = primes[i] % 10, aux[2] = primes[i] / 10;
			else
				aux[0] = 1, aux[1] = primes[i];

			multiply(res, aux, tmp);

			atrib(res, tmp);

		}

	}

	for (int i = res[0]; i; --i)
		g << res[i];

	return 0;
}

//Trust me, I'm the Doctor!