题意:给定一个N,求∑gcd(i, N) 1<=i <=N
分析:对于gcd(x,N)=y有gcd(x/y,N/y)=1,这两者是一一对应的,换句话说有多少个数x满足x/y与N/y互质,就有多少个gcd(x,N)=y,所以对于最大公约数gcd(x,N)=y所做的贡献就是y*o(N/y),(o代表是欧拉函数),所以我们就是要枚举N的每个因子,然后求其另一个因子的欧拉函数,最后求乘积和即可。
下面是代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
typedef long long ll;
ll Euler(ll x)//求x的欧拉函数
{
ll ans=x;
for(ll i=2;i*i<=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()
{
ll n;
while(scanf("%lld",&n)!=EOF)
{
ll ans=0;
ll t=sqrt(n);
for(int i=1;i<=t;i++)
{
if(n%i==0)
{
ans+=i*Euler(n/i);
if(i*i!=n) ans+=n/i*Euler(i);
}
}
printf("%lld\n",ans);
}
return 0;
}