Cod sursa(job #798694)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 16 octombrie 2012 23:05:43
Problema Sum Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 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;

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 = 2; i * i <= aux; i++)
        if(aux % i == 0) {
            while(aux % i == 0)
                aux /= i;
            fact[++fact[0]] = 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);

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

	return 0;
}