给出一个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的各个因子,然后每一个因子站属于自己的空位置。算每一个位置的贡献。
代码:
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <map>
using namespace std;
typedef long long ll;
#define INF 0x3fffffff
const int mod = 1e9 + 7;
ll n;
map<int, int>appear;
vector<int>pri;
vector<pair<int, int>>ii;
void input()
{
cin >> n;
}
void solve()
{
ll i, j;
ll sum = 0;
for (i = 1; i*i <= n; i++)
{
if (n%i)continue;
pri.push_back(i);
pri.push_back(n / i);
appear[i] = 1;
appear[n / i] = 1;
}
sort(pri.begin(), pri.end());
int sz = pri.size();
for (j = sz - 1; j >= 0; j--)
{
int r = pri[j];
int nu = n / r;
int minus = 0;
int iisz = ii.size();
for (i = iisz - 1; i >= 0; i--)
{
if (ii[i].first%r == 0)
{
minus += ii[i].second;
}
}
sum = sum + r*(nu - minus);
ii.push_back(make_pair(r, nu - minus));
}
cout << sum ;
}
int main()
{
//freopen("i.txt", "r", stdin);
//freopen("o.txt", "w", stdout);
input();
solve();
//system("pause");
return 0;
}