Pagini recente » Cod sursa (job #2680728) | Cod sursa (job #641081) | Cod sursa (job #1500759) | Cod sursa (job #2419053) | Cod sursa (job #2244719)
#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;
}