Cod sursa(job #304363)

Utilizator alex23alexandru andronache alex23 Data 12 aprilie 2009 11:44:37
Problema Factoriale Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <iostream>
#include <math.h>
#define NMAX 101
#define MMAX 100

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)
	{
		a[i] = new int[NMAX];
		for (int j = 1; j < NMAX; ++j)
		{
			a[i][j] = a[i - 1][j];
		}
		int j = 2, x = i;
		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);
	
	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 B, t = 0, j;
		if (b[i]) 
		{
			B = i * (K - b[i]);
			for (j = 1; j <= rez[0] || t; j++, t /= 10)
				rez[j] = (t += rez[j] * B) % 10;
			rez[0] = j - 1;
		}
	}
	for (int i = rez[0]; i >= 1; --i)
	{
		fprintf(g, "%d", rez[i]);
	}
	fclose(g);

	delete[] rez;
	delete[] b;
	for (int i = 1; i < NMAX; ++i)
		delete[] a[i];
	delete[] *a;
	return 0;
}