Cod sursa(job #467607)

Utilizator crushackPopescu Silviu crushack Data 29 iunie 2010 17:22:51
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <stdio.h>
#include <string.h>
#define lung 5000

int F[lung],doi[lung],R[lung],N;
int ax[lung];

void citire()
{
	freopen("patrate2.in","r",stdin);
	scanf("%d",&N);
	fclose(stdin);
}

void inm(int *a,int b)
{
	int t,i;
	t=0;
	for (i=1;i<=a[0];i++)
	{
		t = (a[i]= a[i]*b+t)/10;
		a[i]%=10;
	}
	while (t)
	{
		a[++a[0]]=t%10;
		t/=10;
	}
}

void fact(int *a,int n)
{
	int i;
	a[1]=a[0]=1;
	for (i=2;i<=n;i++)
		inm(a,i);
}

void DlaN(int *a,int n)
{
	int i;
	a[0]=a[1]=1;
	for (i=0;i<n;i++)
		inm(a,2);
}

void inm(int *a,int *b,int *c)
{
	int i,j;
	for (i=1;i<=a[0];i++)
		for (j=1;j<=b[0];j++)
			c[i+j-1]+= a[i]*b[j];
	c[0]=a[0]+b[0]+1;
	unsigned long long t=0;
	for (i=1;i<=c[0];i++)
	{
		t= (c[i]+=t)/10;
		c[i]%=10;
	}
	while (!c[c[0]] && c[0]>1)
		c[0]--;
}

int* rez()
{
	fact(F,N);
	DlaN(doi,N);
	inm(F,doi,ax);
	memset(doi,0,sizeof(doi));
	DlaN(doi,N*N-N);
	inm(ax,doi,R);
	return R;
}

void scriere(int *a)
{
	int i;
	freopen("patrate2.out","w",stdout);
	for (i=a[0];i;i--)
		printf("%d",a[i]);
	printf("\n");
	fclose(stdout);
}

int main()
{
	citire();
	scriere(rez());
	return 0;
}