Cod sursa(job #518200)

Utilizator blastoiseZ.Z.Daniel blastoise Data 30 decembrie 2010 18:36:19
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.71 kb
#include <stdio.h>

long long N,sol,x,n;
long i,j,nr,ok[100000];
char p[102];

int main()
{
	freopen("fractii.in","r",stdin);
	freopen("fractii.out","w",stdout);

	scanf("%lld",&N);

	for(i=1;(((i*i)<<2)+(i<<2)+1)<=N;i++)
		if((p[i>>3]&(1<<(i&7)))==0)
			for(j=(((i*i)<<1)+(i<<1));((j<<1)+1)<=N;j+=((i<<1)+1))
				p[j>>3]|=(1<<(j&7));

	nr=1;
	ok[nr]=2;

	for(i=1;((i<<1)+1)<=N;i++)
		if((p[i>>3]&(1<<(i&7)))==0)
			ok[++nr]=2*i+1;

	sol=0;
	for(i=2;i<=N;i++)
	{
		x=i;
		j=1;
		n=i;
		do
		{
			if(x%ok[j]==0)
			{
				while(x%ok[j]==0) x/=ok[j];
				n/=ok[j];
				n*=(ok[j]-1);
			}
			j++;
		}
		while(x!=1&&x>=ok[j]);
		sol+=n;
	}

	printf("%lld\n",2*sol+1);
	return 0;
}