Cod sursa(job #177037)

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

long n,i,j,p[800],f[45],r,t;
long l,q,lmax,rez[900],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 ("%ld",&n);

    p[1]=1;l=1;
    t=n*n;
    for (i=1;i<=t;++i){
        r=0;
        for (j=1;j<=l;++j){
            p[j]+=p[j]+r;
            r=p[j]/baza;
            p[j]%=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;
        }
    }
    //printf("%ld\n",q);

    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;
}