Cod sursa(job #128859)

Utilizator saululflorin saulul Data 27 ianuarie 2008 23:48:48
Problema Fractii Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
//#include <conio.h>
//#include <math.h>

#define NMAX 1000000/2+1
long n;
char p[NMAX]; 

void citire()
	{
	FILE *fin;
	fin=fopen("fractii.in","rt");
	fscanf(fin,"%ld",&n);
	fclose(fin);
	}

/*void ciur1()
	{

	
	for(long i=3;i<=n;i+=2)
		if (p[i]==0)			//p[i]==0 ==> i is prime, singurul numar prim par este 2
			for(long j=3*i;j<=n;j+=i<<1)
				p[j]=1;
	
	}*/

void ciur2()
	{
	//p[i]=0 daca 2*i+1 este prim
	for(long i=1;(i<<1)+1<=n;++i)
		{
		if(0==p[i])
			{
				for(long j=i+i+i+1;(j<<1)+1<=n;j+=(i<<1)+1)
						p[j]=1;	
			}
		}
	}


long totient(long n)
{
float tot=n;

if (2==n) return 1;
if ((3==n)||(4==n)||(6==n)) return 2;
if(5==n) return 4;
if (0==(n%2))
	tot=tot*(1-(1/2.0));
for(long i=1;(i<<1)+1<=n;++i)
	if(0==p[i])
		{
		for(long j=i+i+i+1;(j<<1)+1<=n;j+=(i<<1)+1)
						p[j]=1;	
		if(0==n%((i<<1)+1))
			tot*=(1-1.0/((i<<1)+1));
		}
return tot;
}

void calculeaza()
{
long long rez=0;
FILE * fout;
for(long i=2;i<=n;++i)
	rez+=totient(i);

rez=(rez<<1)+1;
fout=fopen("fractii.out","wt");
fprintf(fout,"%lld",rez);
fclose(fout);

}

int main()
	{
	citire();
	//ciur2();
	calculeaza();
	//printf("n= %ld\n",n);
	//printf("lungimea lui bool este %d octeti\n",sizeof(char));
	//printf("lungimea lui long long este %d octeti\n",sizeof(long long));
	//_getch();
	}