Pagini recente » Cod sursa (job #1873544) | Cod sursa (job #549929) | Cod sursa (job #987607) | Cod sursa (job #2804849) | Cod sursa (job #136500)
Cod sursa(job #136500)
#include<stdio.h>
#include<math.h>
long long sum=0;
long v[1000001L][11], n, pows[20];
int vc[1000001L];
char vnotprime[1000001L],vsquare[1000001L];
int doit()
{
long i,j,k,l,s;
long long p,d;
//genereaza puterile lui 2
pows[0]=1;
i=0;
while(pows[i]<n)
{
i++;
pows[i]=pows[i-1]*2;
}
//genereaza numerele prime
for(i=2;i<=n;i++)
{
s=long(sqrt(i));
if(vnotprime[i]==0)
{
v[i][0]=i;
vc[i]++;
}
else
{
if(s*s==i)//daca este patrat perfect
{
vsquare[i]=1;
}
}
s=i+i;
while(s<=n)//ex.: i=2; luam 4, 6, 8, 10...
{
if(vnotprime[i]==0)//daca nu are niciun divizor patrat perfect
{
v[s][vc[s]]=i;
vc[s]++;
}
vsquare[s]=vsquare[i];
vnotprime[s]=1; //numarul nu e prim
s+=i;
}
}
sum=n;
for(i=2;i<=n;i++)
{
//printf("\n%ld) ",i);
sum+=n;
//s=0;
for(j=0;j<vc[i];j++)
{
//printf("-%ld ",v[i][j]);
//s-=(n/v[i][j]);
sum-=(n/v[i][j]);
}
if(vc[i]>1)
{
for(k=0;k<vc[i];k++)
{
d=k+1;
for(l=d;l<vc[i];l++)
{
//printf("+%ld ",v[i][k]*v[i][l]);
sum+=(n/(v[i][k]*v[i][l]));
//s+=(n/(v[i][k]*v[i][l]));
}
}
}
//printf("[%lld]",-s);
}
//sum++;
return 0;
}
int main()
{
freopen("fractii.in","r",stdin);
freopen("fractii.out","w",stdout);
scanf("%ld",&n);
doit();
printf("%Ld",sum);
/*
long i,j;
for(i=2;i<=n;i++)
{
printf("\n%ld -> ",i);
for(j=0;j<vc[i];j++)
{
printf("%ld, ",v[i][j]);
}
}*/
fclose(stdin);
fclose(stdout);
return 0;
}