Cod sursa(job #597211)

Utilizator darrenRares Buhai darren Data 21 iunie 2011 14:14:58
Problema Sum Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <fstream>

using namespace std;

int X, N;
int prims[502];
bool isprim[100002];
int fact[10];

void ciur()
{
    prims[++prims[0]] = 2;
    for (int i = 3; i <= 100000; i += 2)
        if (!isprim[i])
        {
            prims[++prims[0]] = i;

            for (long long j = 1LL * i * i; j <= 100000; j += 2 * i)
                isprim[j] = true;
        }
}

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

    ciur();

    fin >> N;
    while (N--)
    {
        long long sumnow = 0;

        fin >> X;

        fact[0] = 0;

        int aux = X;
        for (int i = 1; prims[i] * prims[i] <= X; ++i)
            if (aux % prims[i] == 0)
            {
                fact[++fact[0]] = prims[i];
                while (aux % prims[i] == 0)
                    aux /= prims[i];
            }
        if (aux != 1) fact[++fact[0]] = aux;

        for (int i = 1; i < (1 << (fact[0])); ++i)
        {
            int now = 1;
            for (int j = 0; j < fact[0]; ++j)
                if (i & (1 << j))
                    now *= fact[j + 1];

            int times = (2 * X) / now;

            long long snow = 0;
            snow += 1LL * times * (times + 1) / 2;
            snow *= 1LL * now;

            int bits = 0, aux = i;
            while (aux)
                aux &= aux - 1, ++bits;

            if (bits & 1) sumnow += snow;
            else          sumnow -= snow;
        }

        fout << 1LL * 2 * X * (2 * X + 1) / 2 - sumnow << '\n';
    }

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