Cod sursa(job #424920)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 25 martie 2010 12:29:02
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include<stdio.h>
#define Nmax 5010
#define baza 10000
int doi[Nmax],fact[Nmax],aux[Nmax],n,N,i,Aux;

void copiaza(int a[], int b[])
{
	int n=b[0],i;
	for(i=0;i<=n;i++)
		a[i]=b[i];
}

void inmulteste (int a[], int b[])
{
	int i,j,t,c[Nmax],maxelem;
	maxelem=a[0]+b[0];
	
	for(i=0;i<Nmax;i++) c[i]=0;
	
	a[a[0]+1]=0;
	b[b[0]+1]=0;
		
	for(i=1;i<=a[0];i++)
	{
		for(j=1,t=0; j<=b[0]||t; j++,t/=baza)
			c[i+j-1] = ( t+= c[i+j-1] + a[i]*b[j] ) %baza;
		if(i+j-2>c[0]) c[0]=i+j-2;
	}
	copiaza(a,c);
}


int main()
{
	freopen("patrate2.in","r",stdin);
	freopen("patrate2.out","w",stdout);
	
	scanf("%d",&n);
	
	doi[0]=1;  fact[0]=1; 	aux[0]=1;
	doi[1]=1;  fact[1]=1;   aux[1]=2;
	
	N=n*n;
	
	while(N)
	{
		if(N&1)
			inmulteste(doi,aux);
		
		inmulteste(aux,aux);
		
		N>>=1;
	}
	
	for(i=1;i<=n;i++)
	{
		Aux=i; aux[0]=0;
		while(Aux)
		{
			aux[++aux[0]]=Aux%baza;
			Aux/=baza;
		}
		inmulteste(fact,aux);
	}
	
	inmulteste(fact,doi);
	
	printf("%d",fact[fact[0]]);
	for(i=fact[0]-1;i;i--)
		printf("%04d",fact[i]);
	return 0;
}