Sum
-
描述
-
给你一个数N,使得在1~N之间能够找到x使得x满足gcd( x , N ) >= M,
求解gcd(x,N)的和
-
输入
-
多组测试数据
每行输出两个数N,M(N,M不超int)
输出
- 输出sum 样例输入
-
5 3
样例输出
-
5
上传者
-
多组测试数据
想法:利用欧拉函数解,注意分块进行(1到sqrt(n),sqrt(n)到n)
代码:
#include<stdio.h>
#include<string.h>
long long Euler(long long n)//欧拉函数
{
long long c=n,i;
for(i=2; i*i<=n; i++)
{
if(n%i==0)
{
while(n%i==0)
n/=i;
c=c/i*(i-1);//φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn);
}
}
if(n!=1)
c=c/n*(n-1);
return c;
}
int main()
{
long long a,b;
while(scanf("%lld%lld",&a,&b)!=EOF)
{
int cnt;
long long i,c=0;
for(i=1;i*i<=a;i++)
{
if(a%i==0)
{
if(i>=b)//枚举sqrt(n)到n的因子
{
cnt=i;
c=c+cnt*Euler(a/cnt);//求得与a最大公约数为cnt(i)的数的和
}
if(i*i!=a&&a/i>=b)//枚举1到sqrt(n)的因子。
{
cnt=a/i;
c=c+cnt*Euler(a/cnt);//求得与a最大公约数为cnt(a/i)的数的和
}
}
}
printf("%lld\n",c);
}
return 0;
}