Translate:USACO/humble

来源:互联网 发布:博睿软件测试 编辑:程序博客网 时间:2024/06/06 04:35
 

Translate:USACO/humble

来自"NOCOW"

跳转到: 导航, 搜索

Humble Numbers丑数

译 by tim green


目录

  • 1 描述
  • 2 格式
  • 3 SAMPLE INPUT
  • 4 SAMPLE OUTPUT

[编辑]描述

对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集合。

注意:我们不认为1 是一个丑数。

你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于程序是足够的。

[编辑]格式

PROGRAM NAME: humble

INPUT FORMAT:

(file humble.in)

第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.

第 2 行: K 个被空格分开的整数:集合S的元素

OUTPUT FORMAT:

(file humble.out)

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

[编辑]SAMPLE INPUT

4 192 3 5 7

[编辑]SAMPLE OUTPUT

27
来自"http://www.nocow.cn/index.php/Translate:USACO/humble"
 
这道题有点像动态规划,求出前i-1个数后推出第i个数。
 
官方题解:
我们在数组hum中计算出前n个丑数。为了实现起来更简单,我们把1也作为一个丑数,算法也要因此略微调整一下。

当我们已知前k个丑数,想得到第k+1个,我们可以这样做:

对于每个质数p寻找最小的丑数h  使得 h * p 比上一个丑数大取我们找到的 h * p 中最小的一个:它就是下一个丑数

为了使搜索更快,我们可以为每个质数维护一个索引“pindex”表示每个质数已经乘到了哪个丑数,每次都从那里开始,而不是再从头再来。
(官方源码参见参考代码-C)

var dui:array[0..1000000] of longint;a,num:array[0..100000] of longint;n,m,i,j,k,l,sum:longint;function min(x,y:longint):longint;begin if x<y then exit(x); exit(y);end;begin assign(input,'humble.in'); assign(output,'humble.out'); reset(input); rewrite(output); readln(k,n); for i:=1 to k do  read(a[i]);  num[0]:=1; for i:=1 to n do  begin  num[i]:=maxlongint;  for j:=1 to k do   begin   while num[dui[j]]*a[j]<=num[i-1] do inc(dui[j]);    num[i]:=min(num[i],num[dui[j]]*a[j]);   end;  end; {for i:=1 to n do  writeln(num[i]);} writeln(num[n]); close(input); close(output);end.



 

原创粉丝点击