Cod sursa(job #1332069)

Utilizator felixiPuscasu Felix felixi Data 1 februarie 2015 17:29:13
Problema Patrate2 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream in("patrate2.in");
ofstream out("patrate2.out");

const int baza = 10;

class HugeN{
    private:
        vector <int> x;
    public:
        ///  Constructori
        HugeN() {
            x.push_back( 0 );
        }
        HugeN( long long A ) {
            do {
                x.push_back( A % 10 );
                A/= 10;
            }
            while( A );
        }
        ///  Operators
        HugeN operator +( const HugeN& O );
        HugeN operator *=( long long O );
        HugeN operator = ( const HugeN &O );
        HugeN operator * ( const HugeN &O );
        ///  Afisare
        void afis();
};

inline void HugeN :: afis() {
    for( int i= (int)x.size()-1;  i>=0;  --i ) out << x[i];
}

HugeN HugeN::operator +( const HugeN& O ) {
    int t= 0;
    HugeN C;
    for( int i= 0;  i<(int)O.x.size() || t;  ++i ) {
        if( i == (int)x.size() )  x.push_back( 0 );
        if( i<(int)O.x.size() )  x[i]+= O.x[i];
        x[i]+= t;
        if( x[i] >= baza ) {
            t= 1;
            x[i]-= baza;
        }
        else t= 0;
    }
    C.x= x;
    return C;
}

HugeN HugeN::operator *=( long long O ) {
    long long T= 0;
    for( int i= 0;  i<(int)x.size();  ++i ) {
        long long aux= x[i]*O+T;
        T= aux/baza;
        x[i]= (int)( aux % baza );
    }
    while( T ) {
        x.push_back( T%baza );
        T/= baza;
    }
    return *this;
}

inline HugeN HugeN :: operator =( const HugeN &O ) {
    x= O.x;
    return *this;
}

inline HugeN HugeN :: operator *( const HugeN &O ) {
    HugeN C;
    C.x.resize( (int)x.size() + (int)O.x.size() - 1 );
    for( int i= 0;  i<(int)x.size();  ++i ) {
        for( int j= 0;  j<(int)O.x.size();  ++j ) {
            C.x[i+j]+= x[i]*O.x[j];
        }
    }
    int t= 0;
    for( int i= 0;  i<(int)C.x.size() || t;  ++i ) {
        if( i == (int)C.x.size() )  C.x.push_back( 0 );
        C.x[i]+= t;
        t= C.x[i] / baza;
        C.x[i]%= baza;
    }
    return C;
}

long long N;

int main(){
    in >> N;
    HugeN A(N);
    for( int i = 2; i < N;  ++i ) A*=i;
    HugeN R(1);
    for( int i = 1;  i <= N*N;  ++i )  R*= 2;
    R = R*A;
    R.afis();
    return 0;
}