Cod sursa(job #982309)

Utilizator roots4Irimia Alexandru Gabriel roots4 Data 8 august 2013 23:03:33
Problema Fractii Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 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 , num;
	
	for( int i = 2 ; i <= n ; i++ ){
		
		if( V[i] == 0 && i%2 == 1 ){
			sol += 2*(i-1);
			continue;
		}
		
		
		fi = 1;
		
		t = i;
		
		for( j = 1 ; j <= k && Prim[j]*Prim[j] <= i ; j++ ){
			num = Prim[j];
			if( t % num == 0 ){
				nr = 0;
				while( t % num == 0 ){
					nr++;
					t /= num;
				}
				
				fi *= (num - 1)*power(num , nr - 1);
			}
		}
		
		if( t != 1 )
			fi *= (t-1);
		
		sol += 2*fi;
	}
	sol++;
}

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