Pagini recente » Cod sursa (job #2352377) | Cod sursa (job #2514316) | Cod sursa (job #2282500) | Cod sursa (job #1943470) | Cod sursa (job #798695)
Cod sursa(job #798695)
#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;
}