给出一个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
思路: 答案为sigma(因子*因子数量)。假设GCD(a, b) = c;即a和b的最大公约数为c。则GCD(a/c, b/c) = 1;因此用欧拉公式求出[1-a/c]中与a/c互质的数量即是最大公约数为c的数量。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef long long ll;
ll Eular(ll m)
{
ll result = m;
for (ll i = 2; i*i <= m; i++)
{
if (m % i == 0)
{
result -= result / i;
while (m % i == 0)
{
m /= i;
}
}
}
if (m > 1)
{
result -= result/m;
}
return result;
}
int main()
{
ll n;
cin >> n;
{
ll result = 0;
for (ll i = 1; i * i <= n; i++)
{
if (n % i == 0)
{
result += Eular(n / i)*i;
if (n != i * i)
{
result += (n / i) * Eular(i);
}
}
}
cout << result << endl;
}
return 0;
}