牢记gcd最大公因数和lcm最小公倍数

  由于不会辗转相除法,在不能带资料的比赛中肯定会吃亏。上次天体报名赛就现场找规律写了个gcd,虽然过了但是很丢人啊啊啊。。

  直接进入正题,gcd有以下恒等式:gcd(a, b) = gcd (a, a mod b),并且边界条件gcd(a, 0) = a;这里假设a>=b

 于是gcd函数就出来了

int gcd(int a, int b){
    return b == 0 ? a : gcd(b, a % b);
}

  至于最小公倍数lcm,也有一个恒等式,lcm(a, b) * gcd(a, b) = a * b;

  证明一下:由唯一分解定理,设a = p1 ^ e1 * p2 ^ e2 *... * pr ^ er,

                                                 b = p1 ^ f1 * p2 ^ f2  *... * pr ^ fr

gcd(a, b) = p1 ^ min(e1, f1) * p2 ^ min(e2, f2) * ... * pr ^ min(er, fr)

lcm(a, b) = p1 ^ max(e1, f1) * p2 ^ max(e2, f2) * ... * pr ^ max(er, fr)

所以恒等式lcm(a, b) * gcd(a, b) = a * b得证。

所以求lcm的方式就出来了,lcm(a, b) = a * b / gcd(a, b)

不过这里要注意,做乘法再做除法会有溢出的风险

所以应该写成 lcm(a, b) = a / gcd(a, b) * b


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值