Cod sursa(job #307167)

Utilizator cypryCiprian Oprisa cypry Data 23 aprilie 2009 15:55:31
Problema Fractii Scor 30
Compilator c Status done
Runda Arhiva de probleme Marime 1.04 kb
#include<stdio.h>
#include<stdlib.h>

int n,nr;

char prim[1000003];
int prime[1000000],nr_prime;

void eratostene(int n){
	int i,j,max;
	for(i=2;i<=n;++i)
		if(prim[i] == 0){
			max = n/i;
			for(j=2;j<=max;++j)
				prim[j*i]=1;
		}
	for(i=1;i<=n;++i)
		if(prim[i] == 0)
			prime[nr_prime++] = i;
	prime[nr_prime]=0x7FFFFFFF;
}

void read(void){
	FILE *f=fopen("fractii.in","r");
	fscanf(f,"%d",&n);
	fclose(f);
}

void scrie(void){
	FILE *f=fopen("fractii.out","w");
	fprintf(f,"%d\n",nr);
	fclose(f);
}

int cmmdc(int a,int b){
	if(a == 0)
		return b;
	if(b == 0)
		return a;
	if(a>b)
		a = a%b;
	else
		b = b%a;
	return cmmdc(a,b);
}

void numara1(void){
	int i,j;
	nr=1;
	for(i=1;i<=n;++i)
		for(j=1;j<i;++j)
			if(cmmdc(i,j) == 1)
				nr += 2;
}

int eulerPhi(int k){
	int m=k,i=1;
	while(prime[i] <= k){
		if(k % prime[i] == 0){
			m = m/prime[i];
			m *= (prime[i] - 1);
		}
		++i;
	}
	return m;
}

void numara(void){
	int i;
	nr=1;
	for(i=2;i<=n;++i)
		nr += 2*eulerPhi(i);
}

int main(void){
	read();
	eratostene(n);
	numara();
	scrie();
	return 0;
}