Cod sursa(job #109988)

Utilizator hadesgamesTache Alexandru hadesgames Data 25 noiembrie 2007 15:16:00
Problema Fractii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <stdio.h>
#define N 1000001
int p[N],prim[100000],e[N],nr;
void ciur(int n)
{
	int i,j;
	for (i=2;i*i<=n;i++)
		if (!p[i])
		{
			for (j=i+i;j<=n;j+=i)
				p[j]=1;
			prim[nr++]=i;
		}
}
int divizor(int k){
	for(int i=0;i<nr;++i)
		if(k%prim[i]==0)
			return prim[i];
	return k;
}
long long euler(int n)
{
	int i,k;
	long long rez=0;
	for (i=2;i<=n;i++)
	{
		if(p[i]){
			//caut cel mai mic div prim al lui i
			k=divizor(i);
			if(i%(k*k)==0)
			{
				e[i]=k*e[i/k];
			}
			else
				e[i]=(k-1)*e[i/k];
		}
		else
			e[i]=i-1;
		rez+=e[i];
	}
	return rez*2+1;
}
int main()
{
	FILE *in,*out;
	int n;
	in=fopen("fractii.in","r");
	out=fopen("fractii.out","w");
	fscanf(in,"%d",&n);
	ciur(n);
	fprintf(out,"%lld",euler(n));
	fclose(in);
	fclose(out);
	return 0;
	
}