Cod sursa(job #168731)

Utilizator razvi9Jurca Razvan razvi9 Data 31 martie 2008 19:17:38
Problema Patrate2 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<cstdio>
#include<cstring>
const int baza=10000;
const int cif=1000;
int nr[cif+1],aux[cif+1],i,j,n,x;
inline void patrat()
{
	memset(aux,0,sizeof(aux));
	for(i=cif;i>=cif/2;i--)
		for(j=cif;j>=cif/2;j--)
			aux[i+j-cif]+=nr[i]*nr[j];
	for(i=cif;i>0;i--){
		aux[i-1]+=aux[i]/baza;
		aux[i]%=baza;}
}
inline void inm(int a)
{
	int i;
	for(i=cif;i>=0;i--)
		nr[i]*=a;
	for(i=cif;i>0;i--){
		nr[i-1]+=nr[i]/baza;
		nr[i]%=baza;}
}
void pow(int n)
{
	if(n==0) {
		nr[cif]=1;
		return;}
	pow(n/2);
	patrat();
	memcpy(nr,aux,sizeof(nr));
	if(n%2) x++;
}
void print()
{
	i=0;
	while(!nr[i]) i++;
	printf("%d",nr[i]);
	i++;
	for(;i<=cif;i++){
		j=baza/10;
		while(j>1 && nr[i]/j==0) {printf("0");j/=10;}
		printf("%d",nr[i]);}
}
int main()
{
	freopen("patrate2.in","r",stdin);
	freopen("patrate2.out","w",stdout);
	scanf("%d",&n);
	pow(n*n);
	if(x) inm(1<<x);
	for(i=2;i<n;i+=2)
		inm(i*(i+1));
	if(i==n) inm(n);
	print();
}