Cod sursa(job #477377)

Utilizator marius135Dumitran Adrian Marius marius135 Data 14 august 2010 13:08:21
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
/*
   Un fel de ciclu a lui eratostene.... nr prime se aduna.... cele cu 2 divizori se scad... cu 3 divizori primi se aduna


*/
#include<stdio.h>

#define maxn 1024 * 256

long long ok[ maxn ], nr[ maxn ], val[ maxn];

void erato(int N)
{
	
	
	for( int i = 2; i<= N; ++i)
	{
		if( ok[ i ]  != 0) continue; // numar de genul 12 ( s-a ocupat 6 de el )
		for( int j = 1; j * i <= N; ++j)
		{
			// limit = j * i * 2  suma e i * ( 1 + 2.... j *2 )
			long long sum = i * (long long ) (j * 2) * ( j * 2 + 1) /2;
			if( nr[ i ] % 2 == 1 || nr[ i ] == 0)
				val[ j * i ] += sum;
			else val[ j * i ] -= sum;
			if( nr[ i ] == 0  && j != 1) 
			{
				nr[ i * j ]++; 
				ok[ i * j ] = 0;
				if( nr[ i * j ] == 1) 
					ok[ i * j ] = 1; 
				continue;
			}
			if( nr[ i ] == nr[ i * j ] )
				ok[ i * j ] = 1;
			
		}
	}
}

int main()
{
	int N;
	freopen("sum.in","r",stdin);
	freopen("sum.out","w",stdout);
	scanf("%d", &N);
	
	erato( 100000 );
	
	for( int i = 1; i <= N; ++i)
	{
		int a;
		scanf("%d", &a);
		long long rez = (long long ) a * ( 2 * a+ 1)  - val[ a ];;
		printf("%lld\n", rez);
	}
	
	
	
	return 0;
}