Cod sursa(job #2244719)

Utilizator nurof3nCioc Alex Andrei nurof3n Data 23 septembrie 2018 15:21:26
Problema Sum Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.09 kb
#include <fstream>

using namespace std;

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

const int N_MAX = 100000;
int totient[N_MAX + 1];

const int BUFFER_SIZE = 1 << 20; //dimensiune buffer

class InParser
{
private:

    ifstream in; //obiectul de tip fisier
    char *buffer; //bufferul in care citim
    int sp; //indicele la care suntem in buffer
    int size; //retine cate caractere am citit in buffer

    char read_ch()
    {
        sp++;
        if(sp == size) //s-a golit bufferul, citim din fisier
        {
            sp = 0;
            in.read(buffer, BUFFER_SIZE); //Citire blocuri de octeti
            size = in.gcount(); //Numar octeti cititi in buffer
            if(eof())
                return 0;
        }
        return buffer[sp];
    }

public:
    InParser(const char* nume)
    {
        in.open(nume, ios::in | ios::binary);  //Deschidere fisier in mod binar
        buffer = new char[BUFFER_SIZE];
        sp = BUFFER_SIZE - 1; //initializam a.i. parsarea sa inceapa cu o citire in buffer
        size = BUFFER_SIZE;
    }

    bool eof()
    {
        return size == 0;
    }

    bool operator >> (int &n)
    {
        char c;
        n = 0;
        while(!eof() && !isdigit(c = read_ch()) && c != '-' && c != '+');
        if(eof())
            return false; //citire fara succes
        int sign = 1;
        if(c == '-')
            sign = -1;
        else if(c != '+')
            n = c - '0';
        while(isdigit(c = read_ch()))
            n = 10 * n + c - '0';
        n *= sign;
        return true; //citire cu succes
    }
};

void compute_totient2(int N) {
    for(int i = 1; i <= N; i++)
        totient[i] = i;
    for(int i = 2; i <= N; i += 2)
        totient[i] >>= 1;
    for(int i = 3; i <= N; i += 2)
        if(totient[i] == i)
            for(int j = i; j <= N; j += i)
                totient[j] -= totient[j] / i;
}

int main() {
    compute_totient2(N_MAX);
    int N, X;
    in >> N;
    while(N--) {
        in >> X;
        out << 2LL * X * totient[X] << '\n';
    }

    return 0;
}