Cod sursa(job #2010759)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 14 august 2017 12:05:38
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
/*
Colectia personala de operatii pe numere mari - C++ ( classes )
Implementate de Robert Simoiu
Incluzand extragerea radacinii patrate cu un numar finit de zecimale
*/

# include <cmath>
# include <cstdio>
# include <cstring>
# include <vector>
using namespace std ;

const char *FIN = "sarpe.in", *FOU = "sarpe.out" ;

# define MAX 250
# define verf( X, i ) ( i <= X[0] ? X[i] : 0 )
# define A ( *this )

class Mare : protected vector < int > {
    static const int base = 1000000000, nbase = 9 ;
public :
    Mare ( ) ;
    Mare ( int ) ;

    void operator   = ( char* ) ;
    void operator  += ( Mare& ) ;
    void operator  *= ( int ) ;
    void operator  *= ( Mare& ) ;
    void operator  -= ( Mare& ) ;
    void afis         ( void ) ;
} ;

Mare :: Mare () {
    this -> resize ( MAX ) ;
}

Mare :: Mare ( int X ) {
    this -> resize ( MAX ) ;
    for ( A[0] = 0; X ; X /= base ) {
        A[ ++A[0] ] = X % base ;
    }
}

void Mare :: operator = ( char *X ) {
    A[0] = 0;
    if ( X ) {
        for ( int h = strlen ( X ) ; h > 0 ; h -= nbase ) {
            ++A[0] ;
            for ( int i = max ( 0, h - nbase ) ; i < h; ++i ) {
                A[ A[0] ] = A[ A[0] ] * 10 + X[i] - '0' ;
            }
        }
    }
}

void Mare :: operator += ( Mare &B ) {
    int i, t = 0;
    for ( i = 1; i <= A[0] || i <= B[0] || t; ++i, t /= base )
        A[i] = ( t += verf ( A, i ) + verf ( B, i ) ) % base ;
    A[0] = i - 1;
}

void Mare :: operator *= ( int B ) {
    int i = 1;
    for ( long long t = 0; i <= A[0] || t; ++i, t /= base )
        A[i] = ( t += 1LL * verf ( A, i ) * B ) % base ;
    A[0] = i - 1;
}

void Mare :: operator *= ( Mare &B ) {
    Mare C  ;
    for ( int i = 1, j; i <= A[0]; ++i ) {
        long long t = 0 ;
        for ( j = 1; j <= B[0] || t; ++j, t /= base)
            C[i + j - 1] = ( t += C[i + j - 1] + 1LL * verf ( A, i ) * verf ( B, j ) ) % base;
        if ( i + j - 2 > C[0] )
            C[0] = i + j - 2;
    }

    A = C ;
}

void Mare :: operator -= ( Mare &B ) {
    int t = 0;
    for ( int i = 1; i <= A[0]; ++i ) {
        t = ( A[i] -= verf ( B, i ) + t ) < 0 ;
        A[i] += t * base ;
    }
    for ( ; A[0] > 1 && !A[A[0]]; --A[0] ) ;
}

void Mare :: afis ( void ) {
    freopen ( FOU, "w", stdout ) ;
    printf ( "%d", A[ A[0] ] ) ;
    for ( int i = A[0] - 1; i ; --i ) {
        printf ( "%09d", A[i] ) ;
    }
}

# undef A

Mare N ;
char S[1010] ;

int main ( void ) {
    fscanf ( fopen ( FIN, "r" ) , "%s", S ) ;
    if ( S[0] == '1' ) fprintf ( fopen ( FOU, "w" ) , "2" ) ;
    else {
        N = S ;
        Mare A = 1, B = 2, C = N, D = N ;
        C -= A, D -= B, C *= D, C *= 2, N *= 4, N += C ;
        N.afis () ;
    }
}