莫比乌斯反演。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 40000 using namespace std; int n,prime[maxn],top=0,miu[maxn+50]; bool vis[maxn+50]; void get_table() { miu[1]=1; for (int i=2;i<=maxn;i++) { if (!vis[i]) { miu[i]=-1; prime[++top]=i; } for (int j=1;j<=top && i*prime[j]<=maxn;j++) { vis[i*prime[j]]=true; if (i%prime[j]) miu[i*prime[j]]=-miu[i]; else {miu[i*prime[j]]=0;break;} } } for (int i=1;i<=n;i++) miu[i]+=miu[i-1]; } int main() { scanf("%d",&n);n--; get_table(); int l=1,r,ans=0; while (l<=n) { r=n/(n/l); ans+=(miu[r]-miu[l-1])*(n/l)*(n/l); l=r+1; } printf("%d\n",ans+2); return 0; }