Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<= i <=N)。
对于60%的数据,0 < N<=2^16。
对于100%的数据,0 < N<=2^32。
Solution
不难想到枚举gcd求贡献,这个gcd一定是n的因数,那么我们就需要求
∑i∣ni∗φ(ni)
∑
i
∣
n
i
∗
φ
(
n
i
)
枚举因数可以直接
n−−√
n
,phi的求法这里直接
φ(n)=n∗Π(Pi−1)ΠPi
φ
(
n
)
=
n
∗
Π
(
P
i
−
1
)
Π
P
i
其中P是n的不同质因数,这样就又是
n−−√
n
的了
Code
#include <stdio.h>
typedef long long ll;
ll phi(ll n) {
ll ret=n,tmp=n;
for (ll i=2;i*i<=tmp;i++) {
if (tmp%i==0) {
ret=ret*(i-1)/i;
while (tmp%i==0) tmp/=i;
}
}
if (tmp>1) ret=ret*(tmp-1)/tmp;
return ret;
}
int main(void) {
ll n; scanf("%lld",&n);
ll tmp=n,ans=0;
for (ll i=1;i*i<=n;++i) {
if (tmp%i==0) {
ans+=i*phi(n/i);
if (i*i<n) ans+=(n/i)*phi(i);
}
}
printf("%lld\n", ans);
return 0;
}