Cod sursa(job #798695)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 16 octombrie 2012 23:10:11
Problema Sum Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>

using namespace std;

#define MAXD 20
int N, X;
int fact[MAXD];
long long totalSum;
bool comp[100000];
int fprim[100000];

void ciur() {
    for(int i = 2; i < 100000; i++)
        if(!comp[i]) {
            fprim[++fprim[0]] = i;
            if((long long)i * i < 100000)
                for(int j = i * i; j < 100000; j += i)
                    comp[j] = true;
        }
}

void go(int p, int nrbits, long long prod) {
    if(p == fact[0] + 1) {
        if(nrbits == 0)
            return;

        int num = (long long)(2 * X) / prod;
        long long crtSum = (long long)num * (num + 1) / 2 * prod;
        if(nrbits & 1)
            totalSum -= crtSum;
        else
            totalSum += crtSum;

        return;
    }

    go(p + 1, nrbits, prod);
    go(p + 1, nrbits + 1, prod * fact[p]);
}

long long solve(int X) {
    totalSum = (long long)2 * X * (2 * X + 1) / 2;
    int aux = X;
    fact[0] = 0;
    for(int i = 1; fprim[i] * fprim[i] <= aux; i++)
        if(aux % fprim[i] == 0) {
            while(aux % fprim[i] == 0)
                aux /= fprim[i];
            fact[++fact[0]] = fprim[i];
        }
    if(aux > 1)
        fact[++fact[0]] = aux;

    go(1, 0, 1);

    return totalSum;
}

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

    ciur();

    scanf("%d", &N);
    for(int i = 0; i < N; i++) {
        scanf("%d", &X);
        printf("%lld\n", solve(X));
    }

	return 0;
}