【USACO题库】3.1.3 Humble Numbers丑数

好久没写USACO的题解了(-v-)


题目描述
对于一给定的素数集合 S = {p1, p2, ..., pK}, 
来考虑那些质因数全部属于S 的数的集合。这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集合。
注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于程序是足够的。

输入要求
第 1 行: 二个被空间分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空间分开的整数:集合S的元素

样例输入
4 19
2 3 5 7

输出要求
单独的一行,写上对于输入的S的第N个丑数。

样例输出
27


这题我刚开始是用暴力去枚举再排序,然后就炸了。。。


正解:

根据题目可以知道,当一个丑数乘以另一个丑数时,得出的结果仍然为丑数。

所以我们可以设一个数组F,F[i]表示从小到大的第i个丑数是多少。

为了方便计算,把F[0]设为1,之后从小到大依次构造丑数。

根据以上所述,可以设一个B数组,B[i]表示第i个丑数构造新的丑数所要乘的F数组的数的位置(仔细理解)

每次构造新的丑数时,就取一个最小的A[i]*F[B[i]]。

因为不同的构造方法可能会产生相同的数,所以算出F[i]后就把所有结果等于F[i]的B[i]加1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值