挺有意思的。
设f[i]表示gcd(i,j)=i的个数,g[i]表示k|gcd(i,j)的个数;
g[i]=(n/i)*(n/i);
g[i]=f[i]+f[2i]+f[3i]+...;
所以f[i]=g[i]-f[2i]-f[3i]-f[4i]-......
#include <bits/stdc++.h> #define int long long using namespace std; int f[100010]; signed main() { int n; cin>>n; long long ans=0; for(int i=n;i>=1;i--){ f[i]=(n/i)*(n/i); for(int j=2;j*i<=n;j++){ f[i]-=f[j*i]; } ans+=f[i]*i; } cout<<ans; }