Cod sursa(job #794014)

Utilizator ChallengeMurtaza Alexandru Challenge Data 4 octombrie 2012 23:22:28
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <fstream>
#include <iostream>

//#define DEBUG

#ifndef DEBUG
	#define PRINT(x)
	#define D if(0)
#else
	#define PRINT(x) \
		cout<<#x<<":\t"<<x<<endl
	#define D if(1)
#endif

using namespace std;

const char InFile[]="patrate2.in";
const char OutFile[]="patrate2.out";
const int HUGEINT_SIZE=20111;
const int HUGEINT_BASE=1000000;
const int HUGEINT_DIGITS=6;

ifstream fin(InFile);
ofstream fout(OutFile);

typedef int HUGEINT[HUGEINT_SIZE];

int N;
HUGEINT A;

inline void MUL(HUGEINT A, int b)
{
	int i=1,t=0;
	for(;i<=A[0] || t;t/=HUGEINT_BASE,++i)
	{
		A[i]=(t+=A[i]*b)%HUGEINT_BASE;
	}
	A[0]=i-1;
}

inline void Write(HUGEINT A)
{
	fout<<A[A[0]];
	for(register int i=A[0]-1;i>0;--i)
	{
		int t=A[i];
		int nrc=0;
		while(t)
		{
			t/=10;
			++nrc;
		}
		nrc=HUGEINT_DIGITS-nrc;
		for(register int j=0;j<nrc;++j)
		{
			fout<<"0";
		}
		if(A[i])
		{
			fout<<A[i];
		}
	}
}

inline void DWrite(HUGEINT A)
{
	cout<<A[A[0]];
	for(register int i=A[0]-1;i>0;--i)
	{
		int t=A[i];
		int nrc=0;
		while(t)
		{
			t/=10;
			++nrc;
		}
		nrc=HUGEINT_DIGITS-nrc;
		for(register int j=0;j<nrc;++j)
		{
			cout<<"0";
		}
		if(A[i])
		{
			cout<<A[i];
		}
	}
	cout<<"\n";
}

int main()
{
	fin>>N;
	fin.close();

	PRINT(N);

	A[0]=A[1]=1;
	for(register int i=2;i<=N;++i)
	{
		MUL(A,i);
	}

	N*=N;
	for(register int i=1;i<=N;++i)
	{
		MUL(A,2);
	}

	Write(A);
	fout.close();
	return 0;
}