Cod sursa(job #304372)

Utilizator alex23alexandru andronache alex23 Data 12 aprilie 2009 12:44:36
Problema Factoriale Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <iostream>
#include <math.h>
#define NMAX 101
#define MMAX 3000

using namespace std;

FILE *f = fopen("factoriale.in", "r"), *g = fopen("factoriale.out", "w");

int **a, *b, *rez, N, K;

int main()
{

	a = new int*[NMAX];
	a[1] = new int[NMAX];
	for (int i = 1; i < NMAX; ++i)
	{
		a[1][i] = 0;
	}
	for (int i = 2; i < NMAX; ++i)
	{
		int j = 2, x = i;
		a[i] = new int[NMAX];
		for (int j = 1; j < NMAX; ++j)
		{
			a[i][j] = a[i - 1][j];
		}
		while (x > 1)
		{
			while (!(x % j))
			{
				a[i][j]++;
				x = x / j;
			}
			j++;
		}
	}

	b = new int[NMAX];
	for (int i = 1; i < NMAX; ++i)
		b[i] = 0;

	fscanf(f, "%d %d", &N, &K);
	for (int i = 0; i < N; ++i)
	{
		int x;
		fscanf(f, "%d", &x);
		for (int j = 1; j < NMAX; ++j)
			b[j] = (b[j] + a[x][j]) % K;
	}
	fclose(f);

	for (int i = 1; i < NMAX; ++i)
		delete[] a[i];
	delete[] *a;
	
	rez = new int[MMAX];
	for (int i = 0; i < MMAX; ++i)
	{
		rez[i] = 0;
	}
	rez[0] = rez[1] = 1;
	
	for (int i = 2; i < NMAX; ++i)
	{
		int t = 0;
		if (b[i]) 
		{
			//B = i * (K - b[i]); B = i la puterea K - b[i]
			int *B, k, *C;
			B = new int[MMAX];
			for (int j = 0; j < MMAX; ++j)
				B[j] = 0;
			B[0] = B[1] = 1;
			for (int j = 1; j <= K - b[i]; ++j)
			{
				// B = B * i;
				t = 0;
				for (k = 1; k <= B[0] || t; ++k, t /= 10)
					B[k] = (t += B[k] * i) % 10;
				B[0] = k - 1;
			}
			// rez = rez * B
			C = new int[MMAX];
			//memset(C, 0, sizeof(C) * NMAX);
			for (int i = 0; i < MMAX; ++i)
				C[i] = 0;
			int j;
			for (j = 1; j <= rez[0]; j++)
			{
				for (t = 0, k = 1; k <= B[0] || t; k++, t /= 10)
					C[j + k - 1] = (t += C[j + k - 1] + rez[j] * B[k]) % 10;
				if (j + k - 2 > C[0]) C[0] = j + k - 2;  
			}
			memcpy(rez, C, sizeof(C) * NMAX);  
			//for (int i = 0; i < MMAX; ++i)
			//	rez[i] = C[i];
			delete[] B;
			delete[] C;
		}
	}
	for (int i = rez[0]; i >= 1; --i)
	{
		fprintf(g, "%d", rez[i]);
	}
	fclose(g);

	delete[] rez;
	delete[] b;
	return 0;
}