Cod sursa(job #202808)

Utilizator alex_mircescuAlex Mircescu alex_mircescu Data 11 august 2008 17:14:08
Problema Sum Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 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() {
	long bla = LNUM/2;
	for (long i = 2; i <= bla; ++i) {
		if (v[i] == 0) {
			for (long j = i ; j <= bla; j += i) {
				last[j] = i;
				v[j] = 1;
				}
			}
		}
	
}

inline void binar() {
	aux = j;
	c = 0;
	while (aux) {
		bn[++c] = aux -( (aux>>1)<<1);
		aux >>= 1 ;
	}
}

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;
		dpn <<= o;
		
		long long sum = 0;
		for (j = 0; j < dpn; ++j) {
			binar();
			long prod = 1,div = 1;
			for (long k = 1; k <= c; ++k) 
				if (bn[k]) 
					div=!div,prod*=v[k];
								
			long vaal = a[i]/prod;
			long sim = prod * vaal *( div*2-1);
			sum += (sim*((long long)vaal))>>1;
			
		}
		printf("%lld\n",sum);
	}
	return 0;
}