Pagini recente » Cod sursa (job #1650262) | Cod sursa (job #1029672) | Cod sursa (job #1962858) | Istoria paginii runda/redsnow_4/clasament | Cod sursa (job #177535)
Cod sursa(job #177535)
#include<fstream>
#include<math.h>
using namespace std;
long a[20];
int ciur[1000001];
//int prime[80000];
int maxdiv[1000001];
//long pr=0;
void gen_ciur(long n)
{
memset(ciur, 0, sizeof(ciur));
ciur[1]=1;
for(long i=4;i<=n;i=i+2)
ciur[i]=1;
for(long i=3;i<=n;i=i+2)
{
int k=i;
while((k=k+i)<=n)
ciur[k]=1;
}
/*prime[1]=2;
pr=1;
for(int i=3;i<=n;i=i+2)
if(ciur[i]==0)
prime[++pr]=i;*/
long j;
for(long i=2;i<=n;i++)
if(ciur[i])
{
j=2;
while(i%j!=0)
j++;
maxdiv[i]=maxdiv[i/j];
}
else
maxdiv[i]=i;
}
long nrelem(long n, long a[20], int m)
{
long s=0;
for(long i=1;i<(1<<m);i++)
{
long p=1,nr=0, t=i, c;
for(int j=1;j<=m;j++)
{
c=1 & t;
t=t>>1;
if(c)
p=p*a[j];
nr+=c;
}
if(nr%2==1)
s+=n/p;
else
s-=n/p;
}
return n-s;
}
long fracnum(long x, long n)
{
int m=0;
/*long y=x;
if(ciur[x]==1)
{
long d=1;
if(maxdiv[x]!=0)
{
a[++m]=maxdiv[x];
while(x%maxdiv[x]==0)
x=x/maxdiv[x];
}
while(x>1)
{
if(x%prime[d]==0)
{
a[++m]=prime[d];
while(x%prime[d]==0)
x/=prime[d];
if(prime[d]>maxdiv[y])
maxdiv[y]=prime[d];
if(prime[d]>maxdiv[x])
maxdiv[x]=prime[d];
}
d++;
}
}
else
a[m=1]=x;
return 1;*/
while(x>1)
{
long t=maxdiv[x];
a[++m]=t;
while(x%t==0)
x=x/t;
}
return nrelem(n,a,m);
}
int main()
{
ifstream f("fractii.in");
ofstream g("fractii.out");
long n;
f>>n;
gen_ciur(n);
long long s=1L;
for(int i=n;i>=2;i--)
{
s+=fracnum(i,i);
//if(i%10000==0)
// cout<<i<<endl;
}
g<<2*s-1;
f.close();
g.close();
return 0;
}