Cod sursa(job #690692)

Utilizator SteveStefan Eniceicu Steve Data 25 februarie 2012 20:09:01
Problema Patrate2 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <fstream>
#include <cstring>

using namespace std;

int N, M, i, j, m[50][3500], factorial[3500], x;

void Citire ()
{
	ifstream fin ("patrate2.in");
	fin >> N;
	fin.close ();
}

void Inmultire (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 Aflare ()
{
	factorial[0] = 1;
	factorial[1] = 1;
	for (i = 2; i <= N; i++)
	{
		Inmultire (factorial, i);
	}
}

void mul (int A[], int B[])
{
	int i, j, t, C[3500];
	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 Ridicare ()
{
	M = N * N;
	m[0][0] = 1;
	m[0][1] = 1;
	m[1][0] = 1;
	m[1][1] = 2;
	x = 2;
	for (i = 2; x <= M; i++, x *= 2)
	{
		memcpy (m[i], m[i - 1], sizeof (m[i - 1]));
		mul (m[i], m[i - 1]);
	}
	x /= 2;
	for (j = i - 1; j >= 0 && M > 0; j--, x /= 2)
	{
		if (M >= x)
		{
			mul (factorial, m[j]);
			M -= x;
		}
	}
}

int main ()
{
	Citire ();
	ofstream fout ("patrate2.out");
	if (N == 1)
	{
		fout << "1";
		fout.close ();
		return 0;
	}
	if (N < 50) N /= 0;
	Aflare ();
	Ridicare ();
	for (j = factorial[0]; j >= 1; j--)
	{
		fout << factorial[j];
	}
	fout.close ();
	return 0;
}