题面
把 g c d ( n , m ) = i gcd(n,m)=i gcd(n,m)=i转换为 g c d ( n / i , m / i ) = 1 gcd(n/i,m/i)=1 gcd(n/i,m/i)=1
就能转换为欧拉函数了
那么对于数 i i i对答案的贡献就是 i × φ ( i ) i×φ(i) i×φ(i)
不是太难 自己推推就能推出来
算是挺好的一个结论了 不过都考烂糊了不能再考了 洛谷上都有 8 8 8道跟这个一个思路的题了…
#include
using namespace std;
typedef long long ll;
ll phi(ll x){
ll res=x;
for(ll i=2LL;i*i<=x;i++){
if(x%i==0)res=res/i*(i-1);
while(x%i==0)x/=i;
}
if(x>1)res=res/x*(x-1);
return res;
}
ll f(ll n){
ll res=0LL;
for(ll i=1LL;i*i<=n;i++){
if(n%i==0){
res+=i*phi(n/i);
if(i*i!=n)res+=(n/i)*phi(i);
}
}
return res;
}
ll n;
int main(){
scanf("%lld",&n);
printf("%lld\n",f(n));
}