USACO 2.4 Humble Numbers

丑数    死搞是绝对不行的....  (  如果不停的生成 用小根堆来维护.... 可行性未知 因为太麻烦而没写.....)  那应该怎么做呢?  (感谢小贺给我介绍了HQM 大牛的做法)

首先我们设一个数组 F[I] ------- 第I 个丑数  (假设Prime 数组中存了所给的质数)
显然我们是要按由小到大的顺序生成.... 并非全部生成在排序....
那么我们可以这样做.....

因为丑数的因子就为所给的质数... 那么我们可以把生成的质数不停的乘以 所给的质数 取最小的作为第I个丑数以此类推..... 那到底该乘以哪个呢?  这里我们又要开一个数组Num[I] 记录当前这个Prime[I] 所对的质数该乘以哪个已生成的丑数来构成新的丑数........ (MS 我没有讲得太清楚 ...但是自己清楚就好了....下面是式子....)


F[I]=Min{Prime[K]*F[Num[K]]}   1<=K<=M (M个质数)
 当选择了确定的 K 时要注意Num[K] 要往后推... (意味着这个丑数已经被Prime[K] 生成过一个新的丑数了!)
边界F[1]=1 (应该很显然把.....)
     Num [I] = 1  (1<=I<=N   第N 个丑数)
PS 特别值得注意的是判重.... (我被这个卡了N 久....)


这个方法真的太拽了.....  很巧妙的生成了当前最小丑数......
理解....消化.....运用..........
posted @ 2008-12-09 13:14  jesonpeng  阅读(161)  评论(0)    收藏  举报