Description
Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
Input
一个整数,为N。
Output
一个整数,为所求的答案。
Sample Input
6
Sample Output
15
枚举每个约数k,如果gcd(m,n)=k,则gcd(m/k,n/k)=k ,则ans+=k*(phi(n/k))。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
#define ll long long
ll phi(ll n);
int main()
{
int n, sum, m;
ll ans;
while (scanf("%d", &n) != EOF)
{
ans = 0;
for (int i = 1;i <= sqrt(n);i++)
{
if (n%i == 0)
{
ans += phi(n / i)*i;
if (i*i < n) ans += n / i*phi(i);
}
}
printf("%lld\n", ans);
}
}
ll phi(ll n)
{
ll ans = n, i;
for (i = 2; i*i <= n; i++)
{
if (n%i == 0)
{
ans = ans / i*(i - 1);
while (n%i == 0)n = n / i;
}
}
if (n>1)ans = ans / n*(n - 1);
return ans;
}