Cod sursa(job #204539)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 24 august 2008 22:29:24
Problema Sarpe Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <stdio.h>   
#include <string.h>   
  
#define cmax 327600   
#define BAZA 1000   
  
int n,m,k,sol[cmax],rez[cmax],s[cmax],s1[cmax],c[cmax],s8[cmax],ss[cmax];   
  
       void inm(int x)   
{   
    int i,t=0;   
    for(i=1;i<=rez[0]||t;++i)   
    {   
        t+=rez[i]*x;   
        rez[i]=t%BAZA;   
        t/=BAZA;   
    }   
    rez[0]=i-1;   
}   
  
  
  
void mul()   
{   
    int i, j, t = 0;   
  
    for (i = 1; i <= rez[0]; i++)   
    {   
    for (t = 0, j = 1; j <= s1[0] || t; j++, t /= BAZA)   
        c[i+j-1] = (t += c[i+j-1] + rez[i]*s1[j]) % BAZA;   
        if (c[0] < i+j-2) c[0] = i+j-2;   
    }   
}   
  
  
void inmult2()   
{int i,t,la=rez[0];   
 for (i=1,t=0;i<=la;++i)   
     {s[i]=(rez[i]*4+t)%BAZA;   
      t=(rez[i]*4+t)/BAZA;   
     }   
 if (t) {s[i]=t;++i;}   
 s[0]=i-1;   
}   
  
void aduna()   
{int i,t,la=s[0],lb=c[0];   
 for (i=1,t=0;i<=la&&i<=lb;++i)   
     {s8[i]=(s[i]+c[i]+t)%BAZA;   
      t=(s[i]+c[i]+t)/BAZA;   
     }   
 for (;i<=la;++i)   
     {s8[i]=(s[i]+t)%BAZA;   
      t=(s[i]+t)/BAZA;   
     }   
 for (;i<=lb;++i)   
     {s8[i]=(c[i]+t)%BAZA;   
      t=(c[i]+t)/BAZA;   
     }   
 if (t) {s8[i]=t;++i;}   
 s8[0]=i-1;   
}   
  
  
void inmult4()   
{int i,t,la=rez[0];   
 for (i=1,t=0;i<=la;++i)   
     {s1[i]=(rez[i]*2+t)%BAZA;   
      t=(rez[i]*2+t)/BAZA;   
     }   
 if (t) {s1[i]=t;++i;}   
 s1[0]=i-1;   
}   
  
  
int main()   
{   
    int i,j,l;   
    freopen("sarpe.in","rt",stdin);   
    freopen("sarpe.out","wt",stdout);   
    scanf("%d", &m);   
    if (m>1){   
    rez[0]=rez[1]=1;   
    inm(m);   
    inmult2();   
    rez[1]-=1;   
    inmult4();   
    rez[1]-=1;   
    mul();   
    aduna();   
    printf("%d",s8[s8[0]]);   
    for(i=s8[0]-1;i>0;--i)   
        printf("%03d",s8[i]);   
    printf("\n"); }   
    else printf("2");   
  
    return 0;   
}