题解 P2303 【[SDOi2012]Longge的问题】
题面非常简洁,求
我们设
考虑
即
由于
对于所有
#include <cstdio>
long long phi(long long n) {
long long res = n;
for(long long i = 2; i * i <= n; i++) {
if(n % i == 0) res = res / i * (i - 1);
while(n % i == 0) n /= i;
}
if(n > 1) res = res / n * (n - 1);
return res;
}
long long f(long long x) {
long long res = 0LL, i = 1LL;
for(; i * i < x; i++)
if(x % i == 0) res += i * phi(x / i) + (x / i) * phi(i);
if(i * i == x) res += i * phi(i);
return res;
}
int main(int argc, char *argv[]) {
long long n;
scanf("%lld", &n);
printf("%lld", f(n));
return 0;
}