Cod sursa(job #494216)

Utilizator Cosmin1490Balan Radu Cosmin Cosmin1490 Data 21 octombrie 2010 00:02:40
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>

#define NMAX 1000002

using namespace std;

bool A[NMAX+2];
int P[NMAX];
int k;
int N;
int T[NMAX+2];


void ciur()
{
	for(int i=4;i<=N+1;i+=2)
	{
		A[i]=true;
	}
	P[++k]=2;
	for(int i=3;i<=N+1;i+=2)
	{
		if(!A[i])
		{
			T[i]=i-1;
			P[++k]=i;
			if(i<=1000)
				for(int j=i*i;j<=N+1;j+=2*i)
					A[j]=true;
		}
	}
}

void citire()
{
	fstream fin("fractii.in",ios::in);
	
	fin>>N;
	
	fin.close();
}

int cmmdc(int a,int b)
{
	int r=a%b;
	while(r)
	{
		a=b;
		b=r;
		r=a%b;
	}
	return b;
}

void totient()
{
	T[1]=1;
	T[2]=1;
	int j;
	int d;
	for(int i=4;i<=N;i++)
	{
		if(T[i]==0)
		{
			j=1;
			while(i%P[j]!=0)
			{
				j++;
			}
			d=cmmdc(i/P[j],P[j]);
			T[i]=T[i/P[j]]*T[P[j]]*d/T[d];
		}
	}
}




void afisare()
{
	fstream fout("fractii.out",ios::out);
	long long S=0;
	
	for(int i=2;i<=N;i++)
		S+=T[i];
	S*=2;
	S+=1;
	
	fout<<S<<"\n\n";
	
//	for(int i=1;i<=N;i++)
//		fout<<T[i]<<"\n";
	
	fout.close();
}

int main(int argc,char*argv[])
{
	citire();
	ciur();
	totient();
	afisare();
}