Translate:USACO/humble

49 篇文章 0 订阅
19 篇文章 0 订阅
 

Translate:USACO/humble

来自"NOCOW"

跳转到: 导航, 搜索

Humble Numbers丑数

译 by tim green


目录

[编辑] 描述

对于一给定的素数集合 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 19
2 3 5 7

[编辑] SAMPLE OUTPUT

27
 
这道题有点像动态规划,求出前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.



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值