#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 10000010
using namespace std;
typedef long long ll;
int n,tot;
int prime[N];
int phi[N];
ll sum[N];
int f[N];
void sieve()
{
phi[1]=1;
sum[1]=1;
for(int i=2;i<=n;i++)
{
if(!f[i])
{
prime[++tot]=i;
phi[i]=i-1;
}
for(int j=1;j<=tot,i*prime[j]<=n;j++)
{
f[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
break;
}else
{
phi[i*prime[j]]=phi[i]*phi[prime[j]];
}
}
sum[i]=sum[i-1]+phi[i];
}
}
int main()
{
scanf("%d",&n);
sieve();
ll print=0;
for(int i=1;i<=tot;i++)
{
int up=n/prime[i];
print+=sum[up];
}
printf("%lld\n",print*2-tot);
}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 10000010
using namespace std;
typedef long long ll;
int n,tot;
int prime[N];
int phi[N];
ll sum[N];
int f[N];
int lowbit(int x){return x&(-x);}
void update(int x,int p)
{
while(x<=n)
{
sum[x]+=p;
x+=lowbit(x);
}
}
ll getsum(int x)
{
ll ret=0;
while(x)
{
ret+=sum[x];
x-=lowbit(x);
}
return ret;
}
void sieve()
{
phi[1]=1;
update(1,1);
for(int i=2;i<=n;i++)
{
if(!f[i])
{
prime[++tot]=i;
phi[i]=i-1;
update(i,phi[i]);
}
for(int j=1;j<=tot,i*prime[j]<=n;j++)
{
f[i*prime[j]]=1;
if(i%prime[j]==0)
{
phi[i*prime[j]]=phi[i]*prime[j];
update(i*prime[j],phi[i*prime[j]]);
break;
}else
{
phi[i*prime[j]]=phi[i]*phi[prime[j]];
update(i*prime[j],phi[i*prime[j]]);
}
}
}
}
int main()
{
scanf("%d",&n);
sieve();
ll print=0;
for(int i=1;i<=tot;i++)
{
int up=n/prime[i];
print+=getsum(up);
}
printf("%lld\n",print*2-tot);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/wzq_qwq/article/details/46932383