Cod sursa(job #1874159)

Utilizator Tiberiu02Tiberiu Musat Tiberiu02 Data 9 februarie 2017 19:01:53
Problema Sum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
# include <fstream>
# include <cstdio>
# include <cstdlib>

using namespace std;

class ifbuffer {
    private:
        char text[100000];
        int size;
        int pos;
        bool isDigit[128];

        FILE *file;

        inline void refill( void ) {
            pos = 0;
            fread( text, 1, size, file );
        }

        inline char getc() {
            char c = text[pos ++];

            if ( pos == size )
                refill();

            return c;
        }

        inline int getnr() {
            char c = getc();
            int nr = 0, p;

            while ( !isDigit[c] && c != '-' )
                c = getc();
            if ( c == '-' ) {
                p = -1;
                c = getc();
            } else
                p = 1;
            while ( isDigit[c] ) {
                nr = nr * 10 + c - '0';
                c = getc();
            }

            return nr * p;
        }

    public:
        inline ifbuffer( char * path, int s = 100000 ) {
            size = s;

            file = fopen( path, "r" );

            int i;
            for ( i = 0; i < '0'; i ++ )
                isDigit[i] = false;
            for ( i = '0'; i <= '9'; i ++ )
                isDigit[i] = true;
            for ( i = '9' + 1; i < 128; i ++ )
                isDigit[i] = false;

            refill();
        }

        inline ifbuffer &operator>>( int &v ) {
            v = getnr();
            return *this;
        }

        inline ifbuffer &operator>>( char &v ) {
            v = getc();
            return *this;
        }

        inline void close() {
            fclose( file );
        }
};

const int MAX_N = 100000;
int phi[1 + MAX_N];


int main() {
    ifbuffer fin( "sum.in" );
    ofstream fout( "sum.out" );

    for ( int i = 2; i <= MAX_N; i ++ )
        phi[i] = i;
    for ( int i = 2; i <= MAX_N; i ++ )
        if ( phi[i] == i )
            for ( int j = i; j <= MAX_N; j += i )
                phi[j] -= phi[j] / i;

    int n;
    fin >> n;

    for ( int i = 0; i < n; i ++ ) {
        int x;
        fin >> x;
        fout << ( long long ) phi[x] * x * 2 << '\n';
    }

    fin.close();
    fout.close();

    return 0;
}