Cod sursa(job #477387)

Utilizator marius135Dumitran Adrian Marius marius135 Data 14 august 2010 13:27:04
Problema Sum Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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>
#include<time.h>
#include<fstream>

using namespace std;
time_t start;
#define maxn 1021 * 103

long long  val[ maxn];
int ok[ maxn ];
int nr[ 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 = i; j <= N; j+= i)
		{
			// limit = j * i * 2  suma e i * ( 1 + 2.... j *2 )
			long long sum = (long long ) j  * ( j/i * 2 + 1) ;
			if( nr[ i ] % 2 == 1 || nr[ i ] == 0)
				val[ j ] += sum;
			else val[ j ] -= sum;
			if( nr[ i ] == 0  && j != 1) 
			{
				nr[ j ]++; 
				ok[ j ] = 0;
				if( nr[ j ] == 1) 
					ok[ j ] = 1; 
				continue;
			}
			if( nr[ i ] == nr[ j ] )
				ok[ j ] = 1;
			
		}
	}
}

int main()
{
	int N;
	//start =clock();
	//freopen("sum.in","r",stdin);
	//freopen("sum.out","w",stdout);
	ifstream f("sum.in"); ofstream g("sum.out");
	f>>N;
	
	erato( 100000 );
	
	for( int i = 1; i <= N; ++i)
	{
		int a;
		f>>a;
		long long rez = (long long ) a * ( 2 * a+ 1)  - val[ a ];;
		g<<rez<<endl;
	}
	
	
	
	return 0;
}