Cod sursa(job #493412)

Utilizator dushmiMihai-Alexandru Dusmanu dushmi Data 18 octombrie 2010 01:35:07
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include<cstdio>
typedef int Huge[1<<20];
Huge rez,n,aux1,aux2,aux;
char s[1<<10];
void scad(Huge A,Huge B)
{
    int i,T=0;
    for(i=B[0]+1;i<=A[0];)
        B[i++]=0;
    for(i=1;i<=A[0];i++)
    {
        A[i]=A[i]-(B[i]+T);
        if (A[i]<0) T=1;
            else T=0;
        if(T) A[i]+=10;
    }
    while (!A[A[0]]) A[0]--;
}
void adun(Huge A,Huge B)
{
    int i,T=0;
    if(B[0]>A[0])
    {
        for(i=A[0]+1;i<=B[0];)
            A[i++]=0;
        A[0]=B[0];
    }
    else
        for(i=B[0]+1;i<=A[0];)
            B[i++]=0;
    for(i=1;i<=A[0];i++)
    {
        A[i]+=B[i]+T;
        T=A[i]/10;
        A[i]%=10;
    }
    if(T) A[++A[0]]=T;
}
void inm(Huge H,int X)
{
    int i,T=0;
    for(i=1;i<=H[0];i++)
    {
        H[i]=H[i]*X+T;
        T=H[i]/10;
        H[i]=H[i]%10;
    }
    while(T)
    {
        H[++H[0]]=T%10;
        T/=10;
    }
}
void editstr()
{
    int aux,st,dr;
    for(int i=0;s[i];i++)
        n[++n[0]]=s[i]-'0';
    st=0;
    dr=n[0]+1;
    while(++st<=--dr)
    {
        aux=n[st];
        n[st]=n[dr];
        n[dr]=aux;
    }
}
void mult(Huge A, Huge B, Huge C)
{
    int i,j,T=0;
    C[0]=A[0]+B[0]-1;
    for(i=1;i<=A[0]+B[0];)
        C[i++]=0;
    for(i=1;i<=A[0];i++)
        for(j=1;j<=B[0];j++)
            C[i+j-1]+=A[i]*B[j];
    for(i=1;i<=C[0];i++)
    {
        T=(C[i]+=T)/10;
        C[i]%=10;
    }
    if(T) C[++C[0]]=T;
}
void atrib(Huge A,Huge B)
{
    for(int i=1;i<=A[0];i++)
        A[i]=0;
    A[0]=B[0];
    for(int i=1;i<=A[0];i++)
        A[i]=B[i];
}
void afis(Huge A)
{
    for(int i=A[0];i>=1;i--)
        printf("%d",A[i]);
}
int main()
{
    freopen("sarpe.in","r",stdin);
    freopen("sarpe.out","w",stdout);
    gets(s);
    editstr();
    if(!(n[0]==1 && n[1]==1))
    {
        atrib(rez,n);
        inm(rez,4);
        atrib(aux1,n);
        Huge x;
        x[0]=1;
        x[1]=1;
        scad(n,x);
        atrib(aux2,n);
        atrib(n,aux1);
        x[0]=1;
        x[1]=2;
        scad(n,x);
        atrib(aux1,n);
        mult(aux1,aux2,aux);
        inm(aux,2);
        adun(rez,aux);
        afis(rez);
    }
    else printf("1");
    return 0;
}