给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
Input
1个数N(N <= 10^9)
Output
公约数之和
Input示例
6
Output示例
15
先求出n的所有因子a, 再求出1到中满足与n的最大公约数为a的数个数,因为gcd(m, n) == a, 所以gcd(m / a, n/a) == 1
m/a <= n/a, 现在问题就变成求小于等于n/a与n/a互质的数的个数
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll euler(ll m){
ll ans = m;
for(ll i = 2; i * i <= m; i++){
if(m % i == 0){
ans = ans / i * (i - 1);
while(m % i == 0)
m /= i;
}
}
if(m > 1)
ans = ans / m * (m - 1);
return ans;
}
int main(){
ll n;
ll ans = 0;
scanf("%I64d", &n);
for(ll i = 1; i * i <= n; i++){
if(n % i == 0){
ans += (n/i) * euler(i);
if(i != n / i){
ans += i * euler(n/i);
}
}
}
printf("%I64d\n", ans);
return 0;
}