Cod sursa(job #160350)

Utilizator sraduvictorSarmasag Radu Victor sraduvictor Data 15 martie 2008 03:00:17
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>

float *vec;
int *ciur, nciur;

int MAXSIZE = 1000000;   
char *p;

void createCiur(int n) 
{
	long long i, j;
	int nr = 1;
	for ( i = 3; (i*i) <= n; i += 2 )
	{         
		if (p[i]== 0) 
		{   
			for (j = (i * i); j <= n; j += (i << 1)) 
				p[j] = 1;   
		}   
	}   
	nciur = 1;
	ciur[0] = 2;
	for ( i = 3; i <= n; i += 2 )
		if ( p[i] == 0 )
		{
			ciur[nciur++] = i;
		}
}

int prime( int n )
{
	for ( int i = 0; ciur[i] * ciur[i] <= n; i++ )
		if ( n % ciur[i] == 0 )
			return ciur[i];
	return 1;
}

int main ( int argc, char *argv[] )
{
	p = new char[1000000];
	vec = new float[1000000];
	ciur = new int[100000];
	FILE *fin = fopen( "fractii.in", "r" );
	int n;
	fscanf( fin, "%d", &n );
	fclose( fin );
	
	createCiur( n );
	vec[1] = n;
	
	for ( int i = 2; i <= n; i++ )
	{
		int nr = prime(i);
		int pr = i / nr;
		if ( nr != 1 && ( ( i / nr ) % nr ) == 0 )
			vec[i] = vec[nr];
		else
			vec[i] = vec[nr] * ( pr - 1 ) / pr;
		fprintf( stderr, "%f ", vec[i] );
	}
	fprintf( stderr, "\n" );
		
	long long rez = 0;
	
	for ( int i = 1; i <= n; i++ )
		rez += (int)ceil(vec[i]);
	
	FILE *fout = fopen( "fractii.out", "w" );
	fprintf( fout, "%lld\n", rez );
	fclose( fout );
	delete p;
	delete vec;
	delete ciur;
	return 0;
}