Pagini recente » Cod sursa (job #207211) | Cod sursa (job #1864920) | Cod sursa (job #1137398) | Cod sursa (job #1014591) | Cod sursa (job #533259)
Cod sursa(job #533259)
#include<stdio.h>
#include<vector>
using namespace std;
int cmmdc(int a,int b)
{
while(b)
{
int r=a%b;
a=b;
b=r;
}
return a;
}
FILE *in,*out;
int N,cntprim,i,j,nr,contscad;
double euler;
bool primviz[1000001]; //cele cu false sunt prime
double totprim[1000001];
double scadere[1000001];
int main()
{
in=fopen("fractii.in","rt");
out=fopen("fractii.out","wt");
fscanf(in,"%d",&N);
euler=1;
//prim[1]=2;
//cntprim=1;
for(i=2;i<=N;i++)
{
if(!primviz[i])
{
euler+=2*(i-1);
for(j=i<<1;j<=N;j+=i)
{
primviz[j]=true;
if(scadere[j])
nr=j/scadere[j];
else
nr=j;
contscad=0;
if(!totprim[j])
totprim[j]=j;
while( !(nr%i) && nr>1 )
{
nr/=i;
contscad++;
}
if(nr<i)
{
euler+=2*( totprim[j]*(1-(double)1/i));
totprim[j]=0;
}
else
{
totprim[j]*=(1-(double)1/i);
scadere[j]+=contscad*i;
}
}
}
}
/* for(i=2;i<=N;i++)
{
nr=i;
double prod=i;
for(j=1;j<=cntprim && prim[j]<=nr;j++)
{
if( !(nr%prim[j]) )
{
nr/=prim[j];
prod*=(1-(double)1/prim[j]);
}
}
euler+=2*prod;
}*/
fprintf(out,"%.0lf",euler);
return 0;
}