Cod sursa(job #798689)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 16 octombrie 2012 22:57:25
Problema Sum Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 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 solve(int X) {
    long long totalSum = (long long)2 * X * (2 * X + 1) / 2;
    long long crtSum;
    int num;
    int aux = X;
    fact[0] = 0;
    for(int i = 2; i * i <= X; i++)
        if(X % i == 0) {
            while(X % i == 0)
                X /= i;
            fact[++fact[0]] = i;
        }
    if(X > 1)
        fact[++fact[0]] = X;

    for(int conf = 1; conf < (1 << fact[0]); conf++) {
        long long prod = 1;
        int numBits = 0;
        for(int i = 1; i <= fact[0]; i++)
            if(conf & (1 << (i - 1))) {
                prod *= fact[i];
                numBits++;
            }

        num = (2 * aux) / prod;
        crtSum = (long long)num * (num + 1) / 2 * prod;
        if(numBits & 1)
            totalSum -= crtSum;
        else
            totalSum += crtSum;
    }

    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;
}