南阳理工acm 998 sum(欧拉函数)

Sum

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
描述

            给你一个数N,使得在1~N之间能够找到x使得x满足gcd( x ,  N  ) >= M,

求解gcd(x,N)的和

输入
多组测试数据

每行输出两个数N,M(N,M不超int)
输出
输出sum
样例输入
5 3
样例输出
5
上传者

ACM_张书军


想法:利用欧拉函数解,注意分块进行(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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值