Cod sursa(job #335667)

Utilizator mlazariLazari Mihai mlazari Data 30 iulie 2009 21:28:39
Problema Patrate2 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>

#define baza 10000

typedef int bignumber[10000];

int n,i;
bignumber fact,d,c1,c2;

void copy(bignumber a,bignumber b) {
  for(int i=0;i<=b[0];i++) a[i]=b[i];
}

void inmulteste(bignumber &a,int v) {
  int t=0,i;
  for(i=1;i<=a[0];i++) {
    a[i]=a[i]*v+t;
    t=a[i]/baza;
    a[i]%=baza;
  }
  if(t) {
    a[0]++;
    a[a[0]]=t;
  }

}

void inmulteste(bignumber a,bignumber b) {
  int t;
  copy(c1,a);
  copy(c2,b);
  a[0]+=b[0];
  int i,j;
  for(i=1;i<=a[0];i++) a[i]=0;
  for(i=1;i<=c2[0];i++) {
    t=0;
    for(j=1;j<=c1[0];j++) {
      a[j+i-1]+=(c2[i]*c1[j]+t)%baza;
      t=(c2[i]*c1[j]+t)/baza;
    }
    if(t) a[c1[0]+i]+=t;
    t=0;
    for(j=1;j<=a[0];j++) {
      a[j]+=t;
      t=a[j]/baza;
      a[j]%=baza;
    }
  }
  if(!a[a[0]]) a[0]--;
}

void pow(int n) {
  if(!n) d[0]=d[1]=1;
  else
   if(n%2) {
     pow(n-1);
     inmulteste(d,2);
   }
   else {
     pow(n/2);
     inmulteste(d,d);
   }
}

int main() {
  freopen("patrate2.in","r",stdin);
  freopen("patrate2.out","w",stdout);
  scanf("%d",&n);
  fact[0]=fact[1]=1;
  for(i=2;i<=n;i++) inmulteste(fact,i);
  d[0]=d[1]=1;
  pow(n*n);
  inmulteste(d,fact);
  printf("%d",d[d[0]]);
  for(i=d[0]-1;i>0;i--) printf("%04d",d[i]);
  return 0;
}