Cod sursa(job #525888)

Utilizator bent_larsenSturzu Antonio-Gabriel bent_larsen Data 26 ianuarie 2011 17:36:14
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
#define NMAX 1000001

int ciur[NMAX];
int phi[NMAX];

//Gaseste pentru fiecare numar un factor prim
void eratostene()
{
	memset(ciur,0,sizeof(ciur));
	for(int i=2;i<NMAX;i++)
	{
		if(!ciur[i])
		{
			for(int j=i;j<NMAX;j+=i)
			{
				if(!ciur[j])
					ciur[j]=i;
			}
		}
	}
}

void euler()
{
	phi[1]=1;

	for(int i=2;i<NMAX;i++)
	{
		if(!ciur[i]) //numarul e prim
			phi[i]=i-1;
		else
		{
			int nr=i;
			int factor_prim=ciur[i];
			nr/=factor_prim;
			int rez=factor_prim-1;
			while(nr%factor_prim==0)
			{
				nr/=factor_prim;
				rez*=factor_prim;
			}
			phi[i]=rez*phi[nr];
		}
	}
}

int main()
{
	ifstream in("fractii.in");
	ofstream out("fractii.out");

	eratostene();
	euler();
	int n,total=0;
	in>>n;
	for(int i=2;i<=n;i++)
		total+=2*phi[i];
	++total;
	out<<total<<"\n";
	in.close();
	out.close();
}