Description
给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。
题解
这道题考虑每一种gcd的值会出现多少次,即n的每个约数会出现多少次。
对于gcd(b,n)=a, gcd(b/a,n/a)=1,所以gcd=a的值就是φ(n/a),
所以对于n每个因子a,ans=Σphi(n/a)*a
可以在sqrt(n)范围内枚举n的因子,并求出其欧拉函数值
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll n;
ll phi(ll x)
{
ll ans = x;
for(ll i = 2;i <= sqrt(x);i++)
{
if(x % i == 0) ans = ans/i*(i-1);
while(x % i == 0) x /= i;
}
if(x > 1)ans = ans/x*(x-1);
return ans;
}
int main()
{
scanf("%lld",&n);
ll ans = 0;
for(ll i = 1;i <= sqrt(n);i++)
if(n % i == 0)
{
ans += phi(n/i) * i;
if(i * i != n) ans += phi(i)*(n/i);
}
printf("%lld\n",ans);
return 0;
}