Cod sursa(job #1915200)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 8 martie 2017 20:09:20
Problema Sum Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <bits/stdc++.h>
using namespace std;

using i64 = long long;

const int NMAX = 1e5 + 5;

i64 c[NMAX];
int px[NMAX];
bool p[NMAX];

inline char nextch() {
    const int BMAX = 1 << 17;
    static int bp = BMAX;
    static char buff[BMAX];

    if (bp == BMAX) {
        fread(buff, 1, BMAX, stdin);
        bp = 0; }

    return buff[ bp++ ]; }

void get(int &arg) {
    char ch;
    do {
        ch = nextch(); }
    while (ch < '0' || '9' < ch);
    arg = 0;
    do {
        arg = arg * 10 + ch - '0';
        ch = nextch(); }
    while ('0' <= ch && ch <= '9'); }

void pinex() {
    p[0] = p[1] = 1;
    for (int i = 4; i < NMAX; i+= 2)
        p[i] = 1;
    for (int i = 3; i * i < NMAX; i+= 2) if (!p[i])
        for (int j = i * i; j < NMAX; j+= 2 * i)
            p[j] = 1;

    for (int i = 2; i < NMAX; ++i)
        px[i] = 1;
    for (int i = 2; i * i < NMAX; ++i)
    for (int j = i * i; j < NMAX; j+= i * i)
        px[j] = 0;

    for (int i = 2; i < NMAX; ++i) if (!p[i])
    for (int j = i; j < NMAX; j+= i)
        px[j]*= -1;

    for (int i = 2; i < NMAX; ++i) if (px[i])
    for (int j = i; j < NMAX; j+= i)
        c[j]+= (2LL * j / i) * (2LL * j / i + 1) / 2 * i * px[i]; }

int main() {
    freopen("sum.in", "r", stdin);
    freopen("sum.out", "w", stdout);
    int n, t;

    pinex();

    get(n);
    while (n--) {
        get(t);
        printf("%lld\n", (2LL * t) * (2LL * t + 1) / 2 + c[t]); }

    return 0; }