bzoj 2705: [SDOI2012]Longge的问题
题意:给你一个整数n,求
∑ni=1gcd(i,n)
∑
i
=
1
n
g
c
d
(
i
,
n
)
.
分析:
k=gcd(i,n)=>1=gcd(i/k,n/k)=>euler(N)N=n/k∗k
k
=
g
c
d
(
i
,
n
)
=>
1
=
g
c
d
(
i
/
k
,
n
/
k
)
=>
e
u
l
e
r
(
N
)
N
=
n
/
k
∗
k
,所以
ans=∑d|nϕ(n/d)∗d
a
n
s
=
∑
d
|
n
ϕ
(
n
/
d
)
∗
d
.
折半枚举最大公约数k,
ans+=i∗euler(n/i);
a
n
s
+
=
i
∗
e
u
l
e
r
(
n
/
i
)
;
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
LL euler(LL x) {
LL ans = x;
for(LL i = 2; i * i <= x; i++) {
if(x % i) continue;
ans = ans / i * (i - 1);
while(x % i == 0) x /= i;
}
if(x > 1) ans = ans / x * (x - 1);
return ans;
}
int main() {
LL n, ans = 0;
scanf("%lld", &n);
for(LL i = 1; i * i <= n; i++) {
if(n % i) continue;
ans += i * euler(n / i);
if(i * i != n) ans += n / i * euler(i);
}
printf("%lld\n", ans);
return 0;
}