Cod sursa(job #137200)

Utilizator tvladTataranu Vlad tvlad Data 17 februarie 2008 10:14:07
Problema Factoriale Scor 100
Compilator cpp Status done
Runda preONI 2008, Runda 4, Clasele 5-8 Marime 1.04 kb
#include <cstdio>

typedef unsigned long long ulld;

const int NP = 25;
const int P[NP] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
const int C = 5000;

int n,m;
int e[NP], re[NP];
int r[C];

void add ( int x, int e[] ) {
	for (int i = 0; i < NP; ++i)
		for (; x % P[i] == 0; x /= P[i])
			++e[i];
}

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

void build ( int e[] ) {
	r[0] = 1; r[1] = 1;
	for (int i = 0; i < NP; ++i)
		for (int j = 0; j < e[i]; ++j)
			multiply(r,P[i]);
	for (int i = r[0]; i > 0; --i) printf("%d",r[i]);
	printf("\n");
}

int main() {
	freopen("factoriale.in","rt",stdin);
	freopen("factoriale.out","wt",stdout);
	scanf("%d %d",&n,&m);
	for (int i = 0; i < n; ++i) {
		int a;
		scanf("%d",&a);
		for (int j = 1; j <= a; ++j) add(j,e);
	}

	for (int i = 0; i < NP; ++i) {
		if (e[i] % m != 0) {
			re[i] = ((e[i]/m)+1)*m - e[i];
		}
	}

	build(re);
	return 0;
}