Cod sursa(job #982303)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 8 august 2013 22:47:43
Problema Fractii Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include<fstream>
#include<math.h>

using namespace std;

ifstream f("fractii.in");
ofstream g("fractii.out");

int n , k , rad;
long long sol;
bool V[1000000];
int Prim[100000];


int power( int a , int b ){
	
	if(b==0)
		return 1;
	
	if( b%2 == 0 ){
		int rez = power(a , b/2);
		return rez*rez;
	}
	else{
		int rez = power(a , b/2);
		return rez*rez*a;
	}
}

void solve(){
	
	int j , fi , t , nr;
	
	for( int i = 1 ; i <= n ; i++ ){
		
		fi = 1;
		
		t = i;
		
		for( j = 1 ; j <= k && Prim[j]*Prim[j] <= i ; j++ ){
			if( t % Prim[j] == 0 ){
				nr = 0;
				while( t % Prim[j] == 0 ){
					nr++;
					t /= Prim[j];
				}
				
				fi *= (Prim[j] - 1)*power(Prim[j] , nr - 1);
			}
		}
		
		if( t != 1 )
			fi *= (t-1);
		
		sol += 2*fi;
	}
	
	sol--;
}

int main(){
	
	f>>n;
	
	Prim[++k] = 2;
	
	rad = (int)(sqrt(n) + 1);
	
	for( int i = 3 ; i <= rad ; i += 2 )
		if( V[i] == 0 ){
			Prim[++k] = i;
			for( int j = i+i ; j <= rad ; j += i )
				V[j] = 1;
		}
	
	solve();
	
	g<<sol<<"\n";
	
	return 0;
}