Pagini recente » Cod sursa (job #256018) | Cod sursa (job #3172932) | Cod sursa (job #1879625) | Cod sursa (job #2947839) | Cod sursa (job #80160)
Cod sursa(job #80160)
#include <stdio.h>
int v[1000],w[1000],a[1000],n,nr,p[1000000],i,j,k,x,suma,s,r,q;
void prim(int n)
{int i,j;
for (i=1;((i*i)<<1)+(i<<1)<=n;i+=1)
{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));
}
}
}
//for (i=1;2*i+1<=n;++i)
// if ((p[i>>3]&(1<<(i&7)))==0) nr++;
//return nr;
}
int main()
{FILE *fin,*fout;
fin=fopen("fractii.in","r");
fscanf(fin,"%d",&n);
fclose(fin);
prim(n);
nr=n;
if (n>1) nr=nr+n-n/2;
for (i=3;i<=n;i++)
{x=(i-1)/2;
if ((i%2==1)&&((p[x>>3]&(1<<(x&7)))==0)) nr=nr+n-n/i;
else {k=0;suma=0;
if (i%2==0) {k++;a[k]=2;}
for (j=3;j<=i/2;j=j+2)
{x=(j-1)/2;
if (((p[x>>3]&(1<<(x&7)))==0)&&(i%j==0)) {k++;a[k]=j;}
}
v[k]=1;
for (j=0;j<=k-1;j++) v[j]=0;
for (j=1;j<=k;j++) w[j]=0;
s=0;r=1;
while (v[0]==0)
{for (j=1;j<=k;j++)
if (w[j]!=(v[j-1]+v[j])%2)
{w[j]=(v[j-1]+v[j])%2;
q=j;
j=k+1;
}
if (w[q]==0) {s--;r=r/a[q];}
else {s++;r=r*a[q];}
if (s%2==1) suma=suma+n/r;
else suma=suma-n/r;
v[k]++;
j=k;
while (v[j]==2) {v[j]=0;j--;v[j]++;}
}
nr=nr+n-suma;
}
}
fout=fopen("fractii.out","w");
fprintf(fout,"%d",nr);
fclose(fout);
return 0;
}