Cod sursa(job #202796)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 11 august 2008 16:54:13
Problema Sum Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <math.h>

#define LNUM 200002

long i, n, a[LNUM / 2], v[LNUM], aux, o, j;
long last[LNUM], bn[16],c;

inline void ciur_patratic() {
	for (long i = 2; i <= LNUM; ++i) {
		if (v[i] == 0) {
			//long sq = i * i;
			//++v[i];
			for (long j = i ; j <= LNUM; j += i) {
				last[j] = i;
				v[j] = 1;
				}
			}
		}
	
}

inline void binar() {
	aux = j;
	c = 0;
	while (aux != 0) {
		bn[++c] = aux % 2;
		aux /= 2;
	}
}

int main() {
	freopen("sum.in", "r", stdin);
	freopen("sum.out", "w", stdout);
	scanf("%ld", &n);
	for (i = 1; i <= n; ++i) {
		scanf("%ld", &a[i]);
	}
	ciur_patratic();
	for (i = 1; i <= n; ++i) {
		aux = a[i];
		o = 0;
		while (aux != 1) {
			if (v[o] != last[aux]) {
				v[++o] = last[aux];
			}
			aux /= last[aux];
		}
	
		a[i]*=2;
		
		long dpn = 1; 
		for (j = 1; j <= o; ++j) {
			dpn *= 2;
		}
		long sum = 0;
		for (j = 0; j < dpn; ++j) {
			binar();
			long prod = 1,div = 0;
			for (long k = 1; k <= c; ++k) 
				if (bn[k] == 1) {
					++div;
					prod*=v[k];
					
				}
				
			sum += prod * ( (a[i]/prod)*(a[i]/prod+1)/2) * ( (!(div%2))*2-1);
			
		}
		printf("%ld\n",sum);
	}
	return 0;
}