Cod sursa(job #147721)

Utilizator slayer4uVictor Popescu slayer4u Data 3 martie 2008 13:43:23
Problema Factoriale Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <stdio.h>
#include <string.h>

long o, u, j, n, k, i, x, l, v[101], rez[10001], p[10001];

void mulmare(long A[], long B[])
{
      long i, j, t, C[10001];
      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));
}

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


int main()
{
	freopen ("factoriale.in", "rt", stdin);
	freopen ("factoriale.out", "wt", stdout);
	
	scanf("%ld %ld", &n, &k);

	for (i = 1; i <= n; i ++)
	{
		scanf("%ld", &x);
		for (o = 1; o <= x; o ++)
		{
			u = o;
			l = 2;
			while (u > 1)
			{
				if (!(u % l))
					u /= l, v[l] ++;
				else
					l ++;
			}
		}
	}

	rez[0] = rez[1] = 1;
	for (i = 2; i <= 100; i ++)
	{
		if (v[i])
		{
			if (v[i] % l)
			{
				l = k - v[i] % k;
				p[0] = p[1] = 1;
				for (j = 1; j <= l; j ++)
					mul(p, i);
				mulmare(rez, p);
			}
		}
	}

	for (i = rez[0]; i >= 1; i --)
		printf("%ld", rez[i]);
	printf("\n");

	return 0;
}