Cod sursa(job #208149)

Utilizator MciprianMMciprianM MciprianM Data 14 septembrie 2008 12:52:28
Problema Patrate2 Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<stdio.h>  
#include<string>  
using namespace std;    
#define MAXL (1<<11)  
int nfact[MAXL];    
int lanp2[MAXL];    
int rezultat[(MAXL<<1)];    
void inmult(int fa){    
  int i,t;    
  for(i=1,t=0;i<=nfact[0]||t;i++,t/=100000)  
    nfact[i]=(t+=nfact[i]*fa)%100000;  
  nfact[0]=i-1;    
}    
void fact(int n){    
   int i;    
   nfact[0]=1;nfact[1]=1;    
   for(i=2;i<=n;i++)    
     inmult(i);    
}    
/*void inm(){ 
  int i, t;   
  for(i=1,t=0;i<=lanp2[0]||t;i++,t/=10)   
    lanp2[i]=(t+=(lanp2[i]<<1))%10;   
  lanp2[0]=i-1;   
}   
void ridic(int p){   
  int i;   
  lanp2[0]=1;lanp2[1]=2;   
  for(i=1;i<p;i++)   
    inm();   
} */  
int sir[MAXL];  
int C[MAXL];  
void inmulteste(int A[], int B[]){  
  int i, j, t;  
  memset(C,0,sizeof(C));  
  for(i=1;i<=A[0];i++){  
    for(j=1,t=0;j<=B[0]||t;j++,t/=100000){  
      C[i-1+j]=(t+=A[i]*B[j]+C[i-1+j])%100000;  
    }    
  }    
  C[0]=i+j-3;  
  memcpy(A,C,sizeof(C));  
}  
void ridic(int p){  
  int i;  
  lanp2[0]=1;lanp2[1]=2;  
  sir[0]=1;sir[1]=2;  
  p--;  
  while(p){  
     if((p&1)){  
       inmulteste(lanp2,sir);  
     }  
     inmulteste(sir,sir);  
     p>>=1;  
  }  
}  
void inmultiremare(){    
  int i, j,t;    
  for(i=1;i<=nfact[0];i++){    
    for(j=1,t=0;j<=lanp2[0]||t;j++,t/=100000){  
      rezultat[i-1+j]=(t+=nfact[i]*lanp2[j]+rezultat[i-1+j])%100000;  
    }    
  }    
  rezultat[0]=i+j-3;    
}    
int main(){    
  int n;    
  freopen("patrate2.in","r",stdin);  
  freopen("patrate2.out","w",stdout);  
  
  scanf("%d", &n);  
  fact(n);    
  ridic(n*n);    
  inmultiremare();    
  int i;  
  printf("%d",rezultat[rezultat[0]]);  
  for(i=rezultat[0]-1;i>0;i--)  
    printf("%05d",rezultat[i]);  
  printf("\n");  
  return 0;    
}