Cod sursa(job #139586)

Utilizator Adriana_SAdriana Sperlea Adriana_S Data 20 februarie 2008 14:11:28
Problema Factoriale Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <stdio.h>
#include <string.h>

const int N_MAX = 128;

int v[N_MAX], fac[N_MAX];

void factori(int X)
{
	int i, wx = X;
	if (X % 2 == 0) {
		fac[2] ++;
		X /= 2;

		while (X % 2 == 0) {
			fac[2] ++;
			X /= 2;
		}
	}

	for (i = 3; i * i <= wx; i += 2) {
		while (X % i == 0) {
			fac[i] ++;
			X /= i;
		}
	}
	
	if (X != 1) fac[X] ++;
}

int l[400], rez[400];

void MULm(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 MUL(int A[], int B[])
{
      int i, j, t, C[400];
      memset(C, 0, sizeof(C));
      for (i = 1; i <= A[0]; i++)
      {
              for (t=0, j=1; j <= B[0] || t; j++, t/=10)
                      C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
              if (i + j - 2 > C[0]) C[0] = i + j - 2;
      }
      memcpy(A, C, sizeof(C));
}


int main()
{
	freopen("factoriale.in", "r", stdin);
#ifndef _SCREEN_
	freopen("factoriale.out", "w", stdout);
#endif

	int N, K, i;
	scanf("%d %d\n", &N, &K);
	for (i = 1; i <= N; i ++) {
		scanf("%d ", &v[i]);
	}

	int j;
	for (i = 1; i <= N; i ++) {
		for (j = 1; j <= v[i]; j ++) {
			factori(j);
		}
	}

	int pt, w;
	rez[0] = 1, rez[1] = 1;

	for (i = 1; i <= 100; i ++) {
//		printf("i = %d fac = %d\n", i, fac[i]);
		if (fac[i] % K != 0) {
			pt = K - (fac[i] % K);

			memset(l, 0, sizeof(l));
			w = i;
			while (w > 0) {
				l[++ l[0]] = w % 10;
				w /= 10;
			}
			for (j = 2; j <= pt; j ++) MULm(l, i);
			MUL(rez, l);
		}
	}

	for (i = rez[0]; i >= 1; i --) {
		printf("%d", rez[i]);
	}

	return 0;
}