传送门biu~
考虑枚举
d=gcd(i,n)(1≤i≤n)
d
=
g
c
d
(
i
,
n
)
(
1
≤
i
≤
n
)
。因为
gcd(i,n)=d
g
c
d
(
i
,
n
)
=
d
,所以
gcd(i/d,n/d)=1
g
c
d
(
i
/
d
,
n
/
d
)
=
1
,枚举
d
d
,求与它互质的数的个数。因为,所以只需要求
φ(n/i)
φ
(
n
/
i
)
就可以了。求
φ
φ
时分解质因数,复杂度
O(n2)
O
(
n
2
)
。
#include<bits/stdc++.h>
using namespace std;
inline long long phi(long long x){
long long re=x;
if(x==1) return 1;
for(long long i=2;i*i<=x;++i){
if(x%i==0){
re=re/i*(i-1);
while(x%i==0) x/=i;
}
}
if(x!=1) re=re/x*(x-1);
return re;
}
int main(){
long long n,ans=0;
scanf("%lld",&n);
for(long long i=1;i*i<=n;++i){
if(n%i==0){
ans+=i*phi(n/i);
if(i*i!=n) ans+=n/i*phi(i);
}
}
printf("%lld\n",ans);
return 0;
}