题意:求 ∑inϕ(i)
同3944杜教筛
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
#define LL long long
using namespace std;
int pr=0;
LL phi[5000010],prime[5000010];
bool v[5000010];
void pre()
{
memset(v,true,sizeof(v));
pr=0;phi[1]=1;
for(int i=2;i<=5000000;i++)
{
if(v[i]) prime[++pr]=(LL)i,phi[i]=(LL)(i-1);
for(int j=1;j<=pr&&(LL)i*prime[j]<=5000000;j++)
{
v[i*prime[j]]=false;
if(i%prime[j]==0){phi[i*prime[j]]=phi[i]*prime[j];break;}
phi[i*prime[j]]=phi[i]*(prime[j]-1);
}
}
// for(int i=1;i<=10;i++) printf("%d ",phi[i]);printf("\n");
for(int i=2;i<=5000000;i++) phi[i]+=phi[i-1];
}
LL solve(int n)
{
if(n<=5000000) return phi[n];
LL ans=0;int pos;
for(int i=2;i<=n;i=pos+1)
{
pos=n/(n/i);
ans+=(pos-i+1)*solve(n/i);
}
return (LL)n*(n+1)/2-ans;
}
int main()
{
pre();
int n;scanf("%d",&n);
printf("%lld",solve(n));
}