1040 最大公约数之和
给出一个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
知识点:
1、与n的公约数,肯定是n的因子
2、那么我们枚举因子x就好了,显然这个因子的对答案的贡
献就是gcd(n,i)=x的个数
3、gcd(n,i)=x的个数,就是gcd(n/x,i/x)=1的个数,那么就是求phi(n/x)
代码实现:
#include <iostream>
#include <string.h>
#include <math.h>
#include <ctime>
#include <bits/stl_algo.h>
#include <stdio.h>
#include <algorithm>
#define LL long long
#define INF 0x3f3f3f3f
#define ull unsigned long long
using namespace std;
const int N = 2e5 + 100;
int sol_phi (int x)
{
int res = x;
for (int 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;
}
int main ()
{
#ifdef MYHOME_Wjvje
freopen("input.txt", "r", stdin);
#endif
long long ans, n;
while (cin >> n)
{
ans = 0;
for (int i = 1; i * i <= n; i ++)
{
if (n % i == 0)
{
ans += (long long) i * sol_phi(n / i);
if(n/i != i)
ans += (long long) n/i * sol_phi(i);
}
}
cout << ans << endl;
}
return 0;
}
THE END;