题意:
求 ∑gcd(i, N) 1<=i <=N,(1<N<2^31)
思路:
枚举N的所有因子d,与N的gcd为d的数有Eular(N/d)个。
于是∑gcd(i, N) 1<=i <=N就等于∑Eular(N/d),d|N。
代码:
#include <cstdio>
typedef long long LL;
LL n, ans;
LL Eular(LL x)
{
LL ret = x;
for (LL i = 2; i*i <= x; ++ i)
{
if (x % i == 0)
{
while (x % i == 0) x /= i;
ret = ret/i*(i-1);
}
}
if (x != 1) ret = ret/x*(x-1);
return ret;
}
int main()
{
while (~scanf("%lld", &n))
{
ans = 0;
LL i = 1;
for (i = 1; i*i < n; ++ i)
{
if (n % i == 0)
{
ans += i*Eular(n/i);
ans += n/i*Eular(i);
}
}
if (i*i == n) ans += i*Eular(i);
printf("%lld\n", ans);
}
}