Codeforces 300E(数学)

本文介绍了一种算法思路,用于解决给定k个数字,寻找最小的正整数n,使n的阶乘成为这k个数字阶乘积的倍数的问题。通过分解质因数并使用二分搜索技术确定答案。

题意:给定k个数字,求最小的正整数n,使得“n的阶乘”是“这k个数字的阶乘的积”的倍数。1<=k<=1e6,数字ai满足1<=ai<=1e7

分析:如果我们能对着k个数字的阶乘的结果分解质因数,那么就可以根据每个质因数的指数来二分最后的答案

   问题的关键就是如何分解a1!a2!a3!a4!.....

   先可以预处理出1..MAX每个数在式子中出现了多少次(对于ai,也就是1~ai中间所有数字出现次数+1),这可以用差分做

   我们知道了cnt[1..MAX]后,接下来就是考虑分解了

   我们从大到小枚举每个数字x

      如果x是合数,我们可以把x分解成一个质因数和另外一个数的乘积,于是我们可以把x位置的次数加到那两个位置上。并且x位置的次数设为0

      如果x是素数,则跳过

   那么最后,每个素数对应的出现总次数就算出来了

   这样是O(n)的

   对于一个数字x的质因数,我们可以在欧拉筛的时候记一下,可以记一下最小的质因数

   欧拉筛也是O(n)的

转载于:https://www.cnblogs.com/wmrv587/p/6549842.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值