Humble Numbers (humble)[USACO 3.1.3]

算法:数论+模拟
 

分析:设我们已知道K个丑数,如果要知道K+1个丑数,只需要在前面对于每个质数P寻找最小的丑数H,使H×P比上一个丑数大且H×P是最小的一个就可以了,再引入一个数组单独记录一下每个质数都计算到了哪个丑数,到时候算直接从这个丑数开始算就行了。

{

ID:1011mashuo

PROG:humble

LANG:PASCAL

}



program humble;



const

 maxn=100;

 maxm=100000;



var

 n,m:longint;

 a,b:array [0..maxn] of longint;{a表示质数,b[i]表示编号为i的质数算到了哪个丑数。}

 ans:array [0..maxm] of longint;



procedure init;

var

 i:longint;

begin

 fillchar(ans,sizeof(ans),0);

 readln(n,m);

 for i:=1 to n do read(a[i]);

 ans[0]:=1;{先设第1小的丑数为1,这是为了便于计算。}

end;



procedure main;

var

 i,j,min:longint;

begin

 for i:=1 to m do

  begin

   min:=maxlongint;

   for j:=1 to n do if (ans[b[j]]*a[j]>ans[i-1]) and (ans[b[j]]*a[j]<min) then min:=ans[b[j]]*a[j];{找最小值。}

   ans[i]:=min;

   for j:=1 to n do if ans[b[j]]*a[j]=min then inc(b[j]);{记录算到了第几个丑数。}

  end;

end;



begin

 assign(input,'humble.in'); reset(input);

 assign(output,'humble.out'); rewrite(output);



 init;

 main;

 writeln(ans[m]);



 close(input); close(output);

end.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值