Cod sursa(job #83329)

Utilizator MarquiseMarquise Marquise Data 10 septembrie 2007 20:32:13
Problema Fractii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include<stdio.h>
#include<math.h>

#define NMAX 1000
int  p[170];
int num = 1;
long n, nr;
char a[130];
long long fr = 1;

void ciur()
{
	int i, j;
	for ( i = 4; i <= NMAX; i = i+2)
		a[i>>3] |= ( 1<<(i&7) );
	for ( i = 3; i <= NMAX; i = i+2)
	{
		if ( !(a[i>>3] & ( 1<<(i&7) ) ) )
			for ( j = 2; j*i <= NMAX; j++)
				a[ ( i*j ) >> 3] |= ( 1<<( ( i*j ) & 7 ));
	}
	p[1] = 2;
	for ( i = 3; i <= NMAX; i = i+2 )
		if ( !( a[i>>3] & ( 1<< (i&7) )))
			p[++num] = i;
}

int main()
{
	long i, ci, j, lim;
	long phi;
	freopen("fractii.in", "r", stdin);
	freopen("fractii.out", "w", stdout);
	scanf("%ld", &n);
	ciur();
	for ( i = 2; i <= n; i++)
	{
		ci = i;
		phi = i;
		lim = sqrt(ci);
		for ( j = 1; p[j] <= lim && ci > 1; j++)
		{
			if ( ci % p[j] ==0)
			{
				phi = phi / p[j] * ( p[j] - 1);
				while ( ci >1 && ci % p[j] == 0)
					ci /= p[j];
			}
		}
		if ( ci >1)
			phi = phi / ci * (ci - 1);

		fr += 2 * phi;
	}
	printf("%lld", fr);
	return 0;
}