计算a阶乘和b的最大公约数

这是一篇关于TopCoder SRM283中数论问题的解决方案,主要探讨如何高效地计算a的阶乘与b的最大公约数。为了避免超时,文章提出了一种算法,通过遍历质数p并找到其作为b因子的幂次k,以及判断p的幂次是否为a的因子,最后将结果相乘。在循环结束后,如果a大于等于b,则将b乘以结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是TopCoder SRM283的一道题目,属于数论的范畴。如果使用算法不适合,会出现超时。算法如下:

    ret = 1;
    for(int p = 2;(long long )p*p<=b; p++){
        if(b%p==0){//p is prime factor of b
            k = 0;
            //calculate k that p^k is factor of b and p^(k+1) is not
            while(b%p==0){
                b = (int)(b/p);
                k++;
            }
            c = (long long )(a/p);
            h = 0;
            int temp = p;
            //judge if p^k is factor of a, if not , calculate h that
            //p^h is factor of a, and p^(h+1) is not
            while(a>=temp){
                h += int(a/temp);
                temp = temp*p;
                if(h>k) break;
            }
            ret = ret*(int)pow(p*1.0,double(MIN(k,h)));
        }
    }
    if(a>=b) ret = ret*b;
    return ret;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值