最大公约数之和
时间限制:
1000
ms | 内存限制:
65535
KB
难度:
4
n=12时,最大公约数有1、2、3、4、12。
gcd(1,12)=1,gcd(5,12)=1,gcd(7,12)=1,gcd(11,12)=1,
gcd(2,12)=2,gcd(10,12)=2,
gcd(3,12)=3,gcd(9,12)=3,
gcd(4,12)=4,gcd(8,12)=4,
gcd(6,12)=6,
gcd(12,12)=12,
所以:
gcd(1,12)+gcd(2,12)+gcd(3,12)+gcd(4,12)+gcd(5,12)+gcd(6,12)+
gcd(7,12)+gcd(8,12)+gcd(9,12)+gcd(10,12)+gcd(11,12)+gcd(12,12)
=4*1+2*2+2*3+2*4+1*6+1*12=40
我们可以发现:上式等价与
φ(12)*1+φ(6)*2+φ(4)*3+φ(3)*4+φ(2)*6+φ(1)*12
=4*1+2*2+2*3+2*4+1*6+1*12
=40
ac代码
#include<stdio.h>
#include<string.h>
#include<math.h>
int eular(int x)
{
int i,ans=x;
for(i=2;i*i<=x;i++)
{
if(x%i==0)
{
ans-=ans/i;
while(x%i==0)
x/=i;
}
}
if(x>1)
ans-=ans/x;
return ans;
}
int main()
{
int n,m;
while(scanf("%d",&n)!=EOF)
{
int i;
long long sum=0;
//m=sqrt(n);
for(i=1;i*i<n;i++)
{
if(n%i==0)
sum+=eular(i)*(n/i)+eular(n/i)*i;
}if(i*i==n)
{
sum+=eular(i)*i;
}
printf("%lld\n",sum);
}
}