Cod sursa(job #344223)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 29 august 2009 10:37:02
Problema Patrate2 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <stdio.h>
#include <string.h>
#define NR 10000
#define P 1<<17
int n,rez[P],exp,p[P];
void mul(int A[], int B)
{
      int i, t = 0;
      for (i = 1; i <= A[0] || t; i++, t /= NR)
              A[i] = (t += A[i] * B) % NR;
      A[0] = i - 1;
}
void mul2(int A[], int B[])
{
      int i, j, t, C[P];
      memset(C, 0, sizeof(C));
      for (i = 1; i <= A[0]; i++)
      {
              for (t=0, j=1; j <= B[0] || t; j++, t/=NR)
                      C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%NR;
              if (i + j - 2 > C[0]) C[0] = i + j - 2;
      }
      memcpy(A, C, sizeof(C));
}
void factorial()
{
	rez[0]=1;
	rez[1]=1;
	int i;
	for (i=2; i<=n; i++)
		mul(rez,i);
}
void putere_2()
{
	p[0]=1;
	p[1]=2;
	while (exp)
	{
		if (exp%2)
			mul2(rez,p);
		mul2(p,p);
		exp/=2;
	}
}
int nrcif(int x)
{
	int salv=x,cont=0;
	while (salv)
	{
		cont++;
		salv/=10;
	}
	return cont;
}
void afisare()
{
	int i,j,t;
	for (i=rez[0]; i>=1; i--)
	{
		if (i!=rez[0])
		{
			t=nrcif(rez[i]);
			if (t<4)
				for (j=1; j<=4-t; j++)
					printf("0");
		}
		printf("%d",rez[i]);
	}
}
int main()
{
	freopen("patrate2.in","r",stdin);
	freopen("patrate2.out","w",stdout);
	scanf("%d",&n);
	exp=n*n;
	factorial();
	putere_2();
	afisare();
	return 0;
}