Cod sursa(job #177036)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 12 aprilie 2008 08:41:27
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>

long n,i,j,p[3300],f[1000],r;
long l,q,lmax,rez[5000],baza=10000;

void output(long x,long nr0){
     if (x==0){printf("0000");return;}
     if (rez[i]>x){
        for (int j=0;j<nr0;j++)printf("0");
        printf("%ld",rez[i]);
     }
     else output(x/10,nr0+1);
}

int main(){
    freopen ("patrate2.in","r",stdin);
    freopen ("patrate2.out","w",stdout);

    scanf ("%d",&n);
    p[1]=1;l=1;
    for (i=1;i<=n*n;i++){
        r=0;   
        for (j=1;j<=l;j++){
            p[j]=p[j]*2+r;
            r=p[j]/baza;
            p[j]=p[j]-r*baza;
        }
        while(r){
                 l++;
                 p[l]=r%baza;
                 r/=baza;
        }
    }
    f[1]=1;q=1;
    for (i=2;i<=n;i++){
        r=0;
        for (j=1;j<=q;j++){
            f[j]=f[j]*i+r;
            r=f[j]/baza;
            f[j]-=r*baza;
        }
        while (r){
              q++;
              f[q]=r%baza;
              r/=baza;
        }
    }
    for (i=1;i<=l;i++)   
        for (j=1;j<=q;j++){   
            rez[i-1+j]+=p[i]*f[j];   
        }   
    lmax=l+q-1;   
    for (i=1;i<=lmax;i++){   
        if (rez[i]>=baza){rez[i+1]+=rez[i]/baza;rez[i]=rez[i]%baza;}   
    }   
    r=rez[lmax+1];
    while (r){
          lmax++;
          rez[lmax]=r%baza;
          r/=baza;
    }
    printf("%ld",rez[lmax]);
    for (i=lmax-1;i;i--)
        output(baza/10,0);
    printf("\n");

return 0;   
}