Cod sursa(job #243491)

Utilizator coderninuHasna Robert coderninu Data 13 ianuarie 2009 11:58:02
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <stdio.h>
#define Nmax 1000001

int N, c[Nmax], rez, i;

int euler(int);
int putere(int b, int e);

int main()
{
	fscanf(fopen("fractii.in", "r"), "%d", &N);
	c[2] = 1; c[3] = 2;
	for ( i = 4; i<=N; ++i )
	{
		c[i] = euler(i);
		rez+=c[i];
	}
	rez+=3;
	fprintf(fopen("fractii.out", "w"), "%d", rez*2+1);
	//for (i = 1; i<=N; ++i) printf("%d ", c[i]);
	return 0;
}

int euler(int x)
{
	int i, cnt, lim = x >> 1, temp = 1, pr=0;
	for (i = 2; i<=lim && x!=1 ; ++i)
	{
		for ( cnt = 0; !(x % i); ++cnt, x/=i );
		if (cnt && !pr && x == 1) return (i-1)*putere(i,cnt-1);
		if (cnt) pr = 1;
		if (cnt) temp*=c[putere(i,cnt)];
	}
	if (x!=1) return x-1;
	return temp;
}

int putere(int b, int e)
{
	if (e == 2) return b*b;
	if (e == 1) return b;
	int temp = putere(b,e / 2);
	if (e&1) return temp*temp*b;
	else return temp*temp;	
}