Cod sursa(job #169107)

Utilizator razvi9Jurca Razvan razvi9 Data 1 aprilie 2008 09:46:57
Problema Patrate2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include<cstdio>
#include<cstring>
const int baza=10000;
const int cif=2000;
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;
	nr[cif]*=a;
	for(i=cif;i>=0;i--){
		nr[i]*=a;
		nr[i]+=nr[i+1]/baza;
		nr[i+1]%=baza;}
}
void pow(int n)
{
	if(n==0) {
		nr[cif]=1;
		return;}
	pow(n/2);
	patrat();
	memcpy(nr,aux,sizeof(nr));
	if(n%2) inm(2);
}
void print()
{
	i=0;
	while(nr[i]==0) i++;
	printf("%d",nr[i]);
	for(i++;i<=cif;i++){
		j=baza/10;
		while(j>1 && nr[i]/j==0) {printf("0");j/=10;}
		printf("%d",nr[i]);}
	printf("\n");
}
int main()
{
	freopen("patrate2.in","r",stdin);
	freopen("patrate2.out","w",stdout);
	scanf("%d",&n);
	pow(n*n);
	for(i=2;i<=n;i++)
		inm(i);
	print();
	fclose(stdout);
	return 0;
}