【USACO题库】3.1.3 Humble Numbers丑数

来源:互联网 发布:中国网络电视台纪实台 编辑:程序博客网 时间:2024/05/16 07:35

好久没写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。

1 0
原创粉丝点击