Cod sursa(job #479126)

Utilizator Astrid28Ruxandra Cohal Astrid28 Data 22 august 2010 23:01:08
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<iostream>
#include<fstream>
#include<cmath>
#define NMax 1000000

using namespace std;

ifstream fin("fractii.in");
ofstream fout("fractii.out");

long n;
long long fractii, phi[NMax];
char ciur[NMax];

void ciur_eratostene( long x )
{
	long i, j;

	for ( i = 2; i <= x; i++ ) 
		if ( !ciur[i] )
		{
			for ( j = 2*i; j <= x; j += i )
				ciur[j] = 1;
		}
}

long long euler( long x )
{
	long x2 = x; 
	long long nr;
	long divizor_prim = 2;
	int putere;
	
	if ( x == 1 )
		return 1;
	
	//daca x e prim
	if ( !ciur[x] )
		return x-1;
	
	//daca x nu e prim
	while ( x > 1 )
	{
		putere = 0;
		while( x % divizor_prim == 0 )
		{
			putere++;
			x /= divizor_prim;
		}

		//daca x e de forma p^e, unde p e prim
		if ( putere >= 1 && x == 1 )
			return (long long) ((divizor_prim - 1) * pow((double)divizor_prim,(double)putere-1));
		//daca x e de forma p^e * q, unde (p,q)=1
		else if ( putere >= 1 && x != 1 )
		{
			nr = (long long) pow((double)divizor_prim,(double)putere);	
			return phi[nr] * phi[x2/nr];
		}

		divizor_prim++;
		while ( ciur[divizor_prim] ) divizor_prim++;
	}

}


int main()
{
	long i;
	
	fin >> n;
	
	ciur_eratostene( n );

	for ( i = 2; i <= n; i++ )
	{
		phi[i] = euler( i );
		fractii += phi[i];
	}
	fractii = fractii * 2 + 1;

	fout << fractii << endl;

	fin.close();
	fout.close();

	return 0;
}