算法:数论+模拟
分析:设我们已知道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.