Cod sursa(job #209812)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 24 septembrie 2008 22:45:34
Problema Patrate2 Scor 10
Compilator c Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>

#define Lmax 1024
#define BASE 1000000000


//formula este (2^n*n)*n
//unde n<=100
int n;
int sol[Lmax],sol1[Lmax];

void citire()//citesc numarul
{
	freopen("patrate2.in","rt",stdin);
    scanf("%d\n", &n);
}

void init(int H[], unsigned long X) //initializez vectorul H cu un scalar
{
  H[0]=0;
    while(X) 
     {
      ++H[0];   
      H[H[0]]=X%BASE;   
      X/=BASE;   
     }   
}


void mul2(int A[])//inmultire cu 2
{
	int i, t;

	for (i=1,t=0;i<=A[0] || t;++i,t/=BASE)
		A[i]=(t+=2*A[i])%BASE;
	A[0]=i-1;
}


void mul(int A[],int B[])//inmultire a doi vectori
{
	int i, t;

	for (i=1,t=0;i<=A[0] || i<=B[0] || t;++i,t/=BASE)
		A[i]=(t+=B[i]*A[i])%BASE;
	A[0]=i-1;
}

void scrie(int A[])//afisez vectorul
{
	int i;
    
    freopen("patrate2.out", "w", stdout);
	printf("%d", A[A[0]]);
	for (i=A[0]-1;i>=1;--i)
		printf("%.9d",A[i]);
	printf("\n");
}


void solve()
{
	int i;
//in sol1 l-am initializat pe n
    init(sol1,n);
	sol[0]=sol[1]=1;
	for (i=1;i<=n*n;++i)
		mul2(sol);//2^n*n
	mul(sol,sol1);//inmultesc pe 2^n*n cu n
	scrie(sol);//afisez rezultatul
}

int main()
{

	citire();
	solve();
    return 0;
}