题目描述:传送门
题解:
这题和51nod上有一题是一样的。
假设
gcd(n,i)=k
g
c
d
(
n
,
i
)
=
k
,则满足
gcd(n,i)=k
g
c
d
(
n
,
i
)
=
k
的i之和就是
φ(nk)∗k
φ
(
n
k
)
∗
k
,即为小于等于
nk
n
k
并且与
nk
n
k
互质的数的和,再乘上最大公因数k。
那么我们可以直接暴力枚举一下就好了。
代码如下:
#include<cstdio>
#include<string>
#include<cmath>
using namespace std;
long long n,ans;
long long phi(long long x){
long long ret=x;
for (int i=2;i<=sqrt(x);i++)
if (x%i==0) {
ret=ret/i*(i-1); while (x%i==0) x=x/i;
if (x==1) break;
}
if (x>1) ret=ret/x*(x-1);
return ret;
}
int main(){
scanf("%lld",&n);
for (int i=1;i<=sqrt(n);i++)
if (n%i==0) {ans+=phi(n/i)*i; if (n/i>sqrt(n)) ans+=phi(i)*n/i;}
printf("%lld\n",ans);
return 0;
}