题意
解析
首先设 g c d ( i , n ) = t gcd(i,n)=t gcd(i,n)=t,答案就是 t t t的累加, t t t一定是 n n n的因子,所以考虑枚举 n n n的所有因子 t t t, g c d ( i , n ) = t = = > g c d ( i / t , n / t ) gcd(i,n)=t ==> gcd(i/t,n/t) gcd(i,n)=t==>gcd(i/t,n/t) 所以 gcd ( i , n ) \gcd(i,n) gcd(i,n)的个数就是 ϕ ( n / t ) \phi(n/t) ϕ(n/t),对答案的贡献值就是 ϕ ( n / t ) ∗ t \phi(n/t)*t ϕ(n/t)∗t
求因子的时候需要利用对称的特点,可以把时间复杂度降低到 O ( n ) O(\sqrt{n}) O(n )
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll get(ll x ){
ll res=x;
for(int i=2;i<=x/i;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;
}
int main(){
ll n;
cin>>n;
ll res=0;
for(int i=1;1ll*i*i<=n;i++){
if(n%i==0){
res+=get(n/i)*i;
if(n/i!=i){
res+=get(i)*(n/i);
}
}
}
cout<<res;
}