Description
Longge is good at mathematics and he likes to think about hard mathematical problems which will be solved by some graceful algorithms. Now a problem comes: Given an integer N(1 < N < 2^31),you are to calculate ∑gcd(i, N) 1<=i <=N.
"Oh, I know, I know!" Longge shouts! But do you know? Please solve it.
"Oh, I know, I know!" Longge shouts! But do you know? Please solve it.
Input
Input contain several test case.
A number N per line.
A number N per line.
Output
For each N, output ,∑gcd(i, N) 1<=i <=N, a line
Sample Input
2 6
Sample Output
3 15
#include<cctype>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<set>
#include<map>
#define REP(i,a,b) for (i=(a);i<=(b);i++)
#define CLEAR(a) memset((a),0,sizeof((a)))
using namespace std;
typedef long long LL;
const double pi = acos(-1.0);
const int maxn = 1e7+10;
const int maxm = 1e3;
const int inf = 99999999;
const float eps = 1e-3;
vector<int> vec;
vector<pair<int,int> > idx;
bool vis[maxn];
int n, L, G;
LL ans;
void init();
void solve();
void outp();
void get_prime()
{
vec.clear();
CLEAR(vis);
int k = 0;
for (int i = 2; i < maxn; i++)
{
if (!vis[i])
{
vec.push_back(i);
}
for (int j = 1; j <= vec.size() && i * vec[j - 1] <= maxn; j++)
{
vis[i * vec[j - 1]] = 1;
}
}
}
void get_pfactor(int n)
{
idx.clear();
for (int k = 0; vec[k]*vec[k] <= n && k < vec.size(); k++)
{
int e = 0;
while (!(n % vec[k]))
{
n /= vec[k];
e++;
}
if (e)
{
idx.push_back(make_pair(vec[k],e));
}
}
if (n > 1)
{
idx.push_back(make_pair(n,1));
}
}
int main()
{
get_prime();
while (~scanf("%d",&n))
{
init();
solve();
outp();
}
return 0;
}
void solve()
{
get_pfactor(n);
int sum = idx.size();
for (int i = 0; i < sum; i++)
{
LL p = idx[i].second;
LL tmp = (p + 1) * (p + 1) * (p + 1);
tmp += (p - 1) * (p - 1) * (p - 1);
tmp -= 2 * p * p * p;
ans *= tmp;
}
}
void init()
{
}
void outp()
{
printf("%I64d\n", ans);
}