Cod sursa(job #915581)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 15 martie 2013 10:08:21
Problema Sarpe Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

#define Nmax 1000000

char s[Nmax];
typedef short int BigNumber[Nmax];

BigNumber A, B, C;

void citire(){

    ifstream f("sarpe.in");

    f.getline( s, Nmax );

    for ( int i = strlen( s ) - 1; i >= 0; i-- )
        A[ ++A[0] ] = s[i] - 48;

    f.close();
}

void afis(BigNumber a){

    ofstream g("sarpe.out");

    for(int i = a[0]; i; i--)
        cout << a[i];

    cout << endl;

    g.close();
}

void inmul(int x, BigNumber a){

    int T = 0;

    for ( int i = 1; i <= a[0]; i++ )
        a[i] = a[i] * x + T,
        T = a[i] / 10,
        a[i] %= 10;

    while ( T )
        a[ ++a[0] ] = T % 10,
        T /= 10;
}

void scadere(BigNumber a, BigNumber b){

    int T = 0;

    for ( int 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 inmultire(BigNumber a, BigNumber b, BigNumber c){

    int T = 0;

    c[0] = a[0] + b[0] - 1;

    for ( int i = 1; i <= a[0]; i++ )
        for ( int j = 1; j <= b[0]; j++ )
            c[ i + j - 1 ] += a[i] * b[j];

    for ( int i = 1; i <= c[0]; i++ )
         T = ( c[i] += T ) / 10,
         c[i] %= 10;

    if (T)
      c[ ++c[0] ] = T;
}

void aduna(int x, BigNumber a){

    int T = 0;

    for ( int i = 1; i <= a[0]; i++, x /= 10 )
        a[i] += T + x,
        T = a[i] / 10,
        a[i] %= 10;

    while( T )
        a[ ++a[0] ] = T % 10,
        T /= 10;
}

void copiaza(BigNumber a, BigNumber b){

    a[0] = b[0];

    for ( int i = 0; i <= a[0]; i++ )
        a[i] = b[i];
}

void rezolva(){

    if( A[0] == 1 && A[1] == 1 ){

         ofstream g("sarpe.out");

         g << "2\n";

         g.close();

         return;
    }

    copiaza(B, A);
    inmultire(A, A, C);
    inmul(2, B);
    inmul(2, C);
    scadere(C, B);
    aduna(4, C);
    afis(C);
}


int main(){

    citire();
    rezolva();

    return 0;
}