Cod sursa(job #400905)

Utilizator paul_gabryelPaul Buda paul_gabryel Data 22 februarie 2010 10:07:50
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.72 kb
#include<cstdio>
#include<iostream>
using namespace std;
int e[35005],p[3805],nrp;
void eratostene ()
{
	e[0]=e[1]=1;
	for(int i=2;i*i<=35000;++i)
		if(e[i]==0)
			for(int j=2*i;j<=35000;j+=i)
				e[j]=1;
	nrp=0;
	for(int i=2;i<=35000&&nrp<3800;++i)
		if(e[i]==0)
			p[nrp++]=i;
}
int euler (int a)
{
	
	int pr=a,d=0,ex;
	while(a>1){
		ex=0;
		while(a%p[d]==0)
			a/=p[d],ex++;
		if(ex>0)
			pr=pr/p[d]*(p[d]-1);
		d++;
		if(p[d]*p[d]>a&&a>1)
			pr=pr/a*(a-1) ,a=1;
	}
	return pr;
}
int main ()
{
	eratostene ();
	int n,i;
	long long s;
	freopen("fractii.in","r",stdin);
	freopen("fractii.out","w",stdout);
	scanf("%d",&n);
	s=1;
	for(i=2;i<=n;i++)
		s+=2*euler(i);
	cout<<s;
	return 0;
}