Cod sursa(job #177051)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 12 aprilie 2008 09:41:39
Problema Patrate2 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.24 kb
#include <stdio.h>
#include <string.h>

long n,i,j,p[2000],f[45],r,t;
long l,q,lmax,rez[2000],baza=10000;
long aux[2000],b[2000],lb;

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

void putere(){
    p[1]=1;l=1;
    t=n*n;
    b[1]=2;lb=1;
    while(t){
        if ((long)(t&1)==1){
            memset(aux,0,2000*4-8);
            for (i=1;i<=l;i++)
                for (j=1;j<=lb;j++)
                    aux[i+j-1]+=p[i]*b[j];
            l+=lb-1;
            for (i=1;i<=l;i++){
                aux[i+1]+=aux[i]/baza;
                aux[i]%=baza;
            }
            r=aux[l+1];
            while (r){
                l++;
                aux[l]=r%baza;
                r/=baza;
            }
            for (i=1;i<=l;++i)p[i]=aux[i];
        }
        t>>=1;
        memset(aux,0,800*4);
        for (i=1;i<=lb;i++)
            for (j=1;j<=lb;j++)
                aux[i+j-1]+=b[i]*b[j];
        lb+=lb-1;
        for (i=1;i<=lb;i++){
            aux[i+1]+=aux[i]/baza;
            aux[i]%=baza;
        }
        r=aux[lb+1];
        while (r){
            lb++;
            aux[lb]=r%baza;
            r/=baza;
        }
        for (i=1;i<=lb;++i)b[i]=aux[i];
    }
}

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

    scanf ("%ld",&n);

    putere();

    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++){
        rez[i+1]+=rez[i]/baza;
        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;
}