Cod sursa(job #514964)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 19 decembrie 2010 22:37:28
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include<fstream>
#include<cmath>
#include<vector>
#define NMAX 10003
#define NMAX2 1000003

using namespace std;

int ciur[NMAX2];
int b[NMAX], n, i;
long long a[NMAX2], pos;

void ciurf()
{
	int i, j;
	for (i=2; i*i<=n; ++i)
		if (ciur[i]==0)
		{
			b[++b[0]]=i;
			for (j=i+i; j<=n; j+=i)
				ciur[j]=1;
		}
}		


long long putere(long long d, long long x)
{
	long long nr=1;
	while (x%d==0)
	{
		nr*=d;
		x/=d;
	}
	return nr;
}

long long numar(long long x)
{
	long long d, p=1, aux=x, i=1;
	d=b[1];i=1;
	while (p==1 && d*d<=x && i<=b[0])
		if (x%d==0) p=putere(d, x);
			else {i+=1;d=b[i];}
	if (i>b[0] || d*d>x) {d=x;p=x;}
	return p/d*(d-1)*a[aux/p];
}
	

int main()
{
	ifstream f("fractii.in");
	ofstream g("fractii.out");
	f>>n;
	ciurf(); a[1]=1;pos=1;
	for (i=2; i<=n; ++i) 
		{
			a[i]=numar(i);
			pos+=a[i]*2;
		}
	g<<pos<<"\n";
	f.close();
	g.close();
	return 0;
}