(gcd)*Orac and LCM

题目链接

codeforces 1350C

题目大意

给出n个数,先两两求出其最小公倍数,构成一个集合m,再求出m里面所有数的最大公因数

思路

cf题解

思路一

用第二个例子来说:
在这里插入图片描述
由唯一分解定理可知,N可以看成多个质数的乘积。对每个数质因子分解,用数组保存每个质因子出现的幂次
在这里插入图片描述
先求最小公倍数的话,新生成的数是取每个质数的最大次幂,以此类推,设新生成的数构成一个集合m
在这里插入图片描述
再对所有的数求最大公约数,就是求新的集合m中,所有数的共同的因子,就是最小的幂数
在这里插入图片描述

思路二

对于 a1 与剩下所有的数组成的最小公倍数,可以推导出:
g c d ( l c m ( a 1 , a 2 ) , l c m ( a 1 , a 3 ) . . . . l c m ( a 1 , a n ) ) = l c m ( a 1 , g c d ( a 2 , a 3 , . . . , a n ) ) gcd(lcm(a1,a2),lcm(a1,a3)....lcm(a1,an)) = lcm(a1,gcd(a2,a3,...,an)) gcd(lcm(a1,a2),lcm(a1,a3)....lcm(a1,an))=lcm(a1,gcd(a2,a3,...,an))
对于每个数都是如此,所以我们求出每个序列后缀的 gcd 就可以了
可以用集合的方法看:lcm是求并集,gcd是求交集。a1先对a2,a3求并集,最后再求交集 等价于 先求a2,a3的交集,再求其与a1的并集

代码

(先放着吧,555,难以理解)

代码一

代码二

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值