Cod sursa(job #137829)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 17 februarie 2008 15:07:06
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <stdio.h>
#include <math.h>

#define MAXN 100000
#define baza 10000000

long n, k, nr, i, v[121], aux, j, o, a[121];
long sol[MAXN+4];

void prim() {
	long ipr = 0, jpr = 0, vb1 = 0;
	for (ipr = 2; ipr <= 100; ++ipr) {
		vb1 = 0;
		for (jpr = 2; jpr * jpr <= ipr; ++jpr) {
			if (ipr % jpr == 0) {
				vb1 = 1;
				break;
			}
		}
		if (vb1 == 0) {
			v[++o] = ipr;
		}
	}
}

void produs(long *w, long val) {
	long ipr = 0,t=0;
	for (ipr = MAXN; ipr >= w[0];ipr--)
	{
		aux = w[ipr] * val + t;
		w[ipr] = aux % baza;
		t = aux / baza;
	}
	if (t != 0) {
		--w[0];
		w[w[0]] = t;
	}
}

int main() {
	freopen("factoriale.in", "r", stdin);
	freopen("factoriale.out", "w", stdout);
	long kk;
	scanf("%ld %ld\n", &n, &kk);
	prim();
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &nr);
		for (j = 1; j <= nr; ++j) {
			aux = j;
			k = 1;
			while (aux != 1) {
				while (aux % v[k] == 0) {
					aux /= v[k];
					++a[v[k]];
				}
				++k;
			}
		}
	}
	/*for (i = 1; i <= 100; ++i) {
		if (a[i] != 0) {
			printf("%ld^%ld\n", i, a[i]);
		}
	}*/
	sol[0] = MAXN;//sol[0] = capat
	sol[MAXN] =1 ;
	for (i = 1; i <= 100; ++i) {
		if (a[i] != 0) {
			if (a[i] % kk != 0) {
				for( long jf = 1; jf <= kk - a[i]%kk; ++jf)
					produs(sol, i);
			}
		}
	}
	
	printf("%ld",sol[sol[0]]);
	
	for( long i = sol[0]+1; i <= MAXN; ++i)
		printf("%07ld",sol[i]);
	
	return 0;
}