Cod sursa(job #50317)

Utilizator mika17Mihai Alex Ionescu mika17 Data 7 aprilie 2007 14:30:13
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <stdio.h>
#define fin "patrate2.in"
#define fout "patrate2.out"
#define MAX 10000
int N,f1[MAX],f2[MAX],r[2*MAX];

void write(int X[])
{
	for(int i=X[0];i;--i)
		printf("%d",X[i]);
        printf("\n");
}

void multby(int X[],unsigned long long sc)
{
	int i,t=0;
	for(i=1;i<=X[0];++i,t/=10)
		X[i] = (t += X[i]*sc) % 10;
	while(t) X[++X[0]] = t%10 , t/=10;
}
void toN(int X[])
{
 int i=0,step = 1;
 X[0] = X[1] = 1; /*
 do
   {
    while(i+step<=N*N)
    {
	  multby(X,1llu<<step);
          i+=step;
    }
    step>>=1;
   }
 while(i<N*N); */
 for(int i=1;i<=N*N;++i)
    multby(X,2);

}

void Nfact(int X[],int N)
{
 X[0] = X[1] = 1;
 for(int i=2;i<=N;++i)
	  multby(X,i);
}

void mult(int X[],int Y[],int Z[])
{
 int i,j,t;
 for(i=1;i<=X[0];++i)
 {
  for(j=1,t=0;j<=Y[0] || t;++j,t/=10)
   Z[i+j-1] = (t+=Z[i+j-1]+X[i]*Y[j]) % 10;
  if(i+j-2 > Z[0]) Z[0] = i+j-2;
 }
}

int main()
{
	freopen(fin,"r",stdin);
	freopen(fout,"w",stdout);
	scanf("%d",&N);
	toN(f1);
	Nfact(f2,N);
	mult(f1,f2,r);
	write(r);
	fclose(stdin);
	fclose(stdout);
	return 0;
}