Cod sursa(job #187812)
Utilizator | Data | 5 mai 2008 15:56:40 | |
---|---|---|---|
Problema | Fractii | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.32 kb |
#include <stdio.h>
//#define er(i) (ch[i/8])&(1<<(i%8))
char ch[1000000];
int n, nr;
void cit()
{
FILE *f=fopen("fractii.in", "r");
fscanf(f, "%d", &n);
fclose(f);
}
void tip()
{
FILE *f=fopen("fractii.out", "w");
fprintf(f, "%d\n", nr);
fclose(f);
}
/*int ver()
{
int i;
for (i=1; i<=n; i++)
//if (er(i)&1==0) return 0;
if (ch[i]==0) return 0;
return 1;
} */
int prim(int nr)
{
int i;
if (nr%2==0) return 0;
for (i=3; i<=nr/2; i+=2)
if (nr%i==0) return 0;
return 1;
}
/*void set_er(int i)
{
ch[i/8]|=1<<(i%8);
} */
void eratos()
{
int i, j, t, num, k, j1;
i=2;
while (i<=n)
{
for (j1=1; j1<=n/i; j1++)
{
j=j1;
//if (er(i*j)&1) continue;
if (ch[i*j]) continue;
num=1;
//set_er(i*j);
ch[i*j]=1;
if (j%i==0)
{
t=1;
while (j%i==0)
{
t*=i;
j/=i;
}
num*=t;
}
if (j%i && j!=1)
{
for (k=i+1; k<=j; k++)
{
t=1;
if (j%k==0)
if (prim(k))
while (j%k==0)
{
t*=k;
j/=k;
}
num*=t-t/k;
}
}
if (j==1) num*=i-1;
nr+=2*num;
}
if (i==2) i++;
else
do
{
i+=2;
} while (!prim(i));
//nr+=2*num;
}
nr+=1;
}
int main()
{
cit();
eratos();
tip();
return 0;
}