Pagini recente » Cod sursa (job #2327849) | Arhiva de probleme | Cod sursa (job #2543560) | Cod sursa (job #1383389) | Cod sursa (job #217146)
Cod sursa(job #217146)
#include <stdio.h>
//include <conio.h>
//#include <math.h>
#include <stdlib.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 (long)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(int argc, char ** argv)
{
int cit;
citire();
//printf("merge citirea...\nn= %ld \n", n);
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));
//getchar();
//getch();
}