2705: [SDOI2012]Longge的问题
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 3687 Solved: 2322
[Submit][Status][Discuss]
Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
HINT
【数据范围】
对于60%的数据,0<N<=2^16。
对于100%的数据,0<N<=2^32。
总结:
本题要求
设f(x) 为
即1到n中与n的gcd为x的数的个数
转化一下
即
于是本题答案为
然后就枚举因子, 暴力即可
#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL n;
LL phi(LL x) {
LL res = x;
for (LL i = 2; i * i <= x; ++i) {
if(x % i == 0) res = res / i * (i - 1);
while(x % i == 0) x /= i;
} if(x > 1) res = res / x * (x - 1);
return res;
}
LL calc(LL x) {
LL res = 0;
for (LL i = 1; i * i <= x; ++i) {
if(i * i == x) res += i * phi(i);
else if(x % i == 0) res += i * phi(x / i) + (x / i) * phi(i);
}
return res;
}
int main() {
scanf("%lld", &n);
printf("%lld\n", calc(n));
return 0;
}