Cod sursa(job #116539)

Utilizator vlad_popaVlad Popa vlad_popa Data 18 decembrie 2007 20:33:26
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include <cstdio>
#include <cstring>

#define FIN "sarpe.in"
#define FOUT "sarpe.out"

int N[1<<15], sol[1<<15], N2[1<<15];
int doi[1<<15] = {1,2,0};
char sir[1<<10];

void read ()
{
    gets (sir);
    N[0] = strlen (sir);
    N2[0] = N[0];
    for (int i = N[0]; i >= 1; -- i)
    {
        N[i] = sir[N[0] - i] - '0';
        N2[i] = N[i];
    }
}

void add(int A[], int B[])  
{  
      int i, t = 0;  
      for (i=1; i<=A[0] || i<=B[0] || t; i++, t/=10)  
              A[i] = (t += A[i] + B[i]) % 10;  
      A[0] = i - 1;  
}  

void mul(int A[], int B)  
{  
      int i, t = 0;  
      for (i = 1; i <= A[0] || t; i++, t /= 10)  
              A[i] = (t += A[i] * B) % 10;  
      A[0] = i - 1;  
}

void sub (int A[], int B[])
{
    int i = 1, t = 0;

    while (i <= A[0])
    {
        A[i] = A[i] - B[i] - t;

        if (A[i] < 0)
            t = 1;
        else
            t = 0;

        A[i] += t * 10;
        ++ i;
    }

    for (; A[0] > 1 && !A[A[0]]; -- A[0]);
}

void mul2(int A[], int B[])  
{  
       int i, j, t, C[1<<15];  
       memset(C, 0, sizeof(C));  
       for (i = 1; i <= A[0]; i++)  
       {  
               for (t=0, j=1; j <= B[0] || t; j++, t/=10)  
                       C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;  
               if (i + j - 2 > C[0]) C[0] = i + j - 2;  
       }  
       memcpy(A, C, sizeof(C));  
}  

void solve ()
{
    if (N[0] == N[1] && N[0] == 1)
    {
        printf ("2\n");
        return;
    }
    sub (N2, doi);
    add (sol, N2);
    mul2 (N2, N2);
    add (sol, N2);
    mul (sol, 2);
    mul (N, 4);
    add (sol, N);   
    
    for (int i = sol[0]; i >= 1; -- i)
        printf ("%d", sol[i]);
    printf ("\n");
}

int
 main ()
{
    freopen (FIN, "rt", stdin);
    freopen (FOUT, "wt", stdout);
    
    read ();
    solve ();
    
    return 0;
}