题目
给出一个n,求1-n这n个数,同n的最大公约数的和。比如:n = 6
1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15
收起
输入
1个数N(N <= 10^9)
输出
公约数之和
输入样例
6
输出样例
15
解题思路:
暴力即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int phi(int N){
int len = sqrt(N);
int ans = N;
for(int i = 2;i <= len;++i)
if(N % i == 0){
while(N % i == 0) N /= i;
ans = ans / i * (i - 1);
}
if(N != 1) ans = ans / N * (N - 1);
return ans;
}
int main(){
int N;
ll ans = 0;
scanf("%d",&N);
int n = sqrt(N);
for(int i = 1;i <= n;++i)
if(N % i == 0){
ans += (ll)i * phi(N / i);
if(i * i != N) ans += (ll)N / i * phi(i);
}
cout<<ans<<endl;
return 0;
}