USACO 3.1 Humble Numbers丑数
Time Limit:12000MS Memory Limit:65536K
Total Submit:151 Accepted:36
Case Time Limit:1000MS
Description
对于一给定的素数集合 S = {p1, p2, ..., pK}, 来考虑那些质因数全部属于S 的数的集合。这个集合包括,p1, p1p2, p1p1, 和 p1p2p3 (还有其它)。这是个对于一个输入的S的丑数集合。
注意:我们不认为1 是一个丑数。
你的工作是对于输入的集合S去寻找集合中的第N个丑数。longint(signed 32-bit)对于程序是足够的。
Input
第 1 行: 二个被空格分开的整数:K 和 N , 1<= K<=100 , 1<= N<=100,000.
第 2 行: K 个被空格分开的整数:集合S的元素
Output
单独的一行,写上对于输入的S的第N个丑数。
Sample Input
4 19
2 3 5 7
Sample Output
27
把1放入优先队列,中每次从优先队列中取出一个元素,k,把2k, 3k, 5k, 7k放入优先队列中从2开始,取出的第n个元素就是第n大丑数
const maxn=300000; var a,s:array[0..maxn] of longint; n,k,i,j,l:longint; procedure up(i:longint); var done:boolean; begin if i=1 then exit; repeat done:=false; if a[i]<a[i div 2] then begin a[0]:=a[i]; a[i]:=a[i div 2]; a[i div 2]:=a[0]; end else done:=true; i:=i div 2; until(i=1) or done; end; procedure inst(x:longint); begin inc(l); a[l]:=x; up(l); end; procedure down(i:longint); var done:boolean; begin done:=false; if 2*i>l then exit; repeat i:=2*i; if (i+1<=l) and (a[i+1]<a[i]) then inc(i); if a[i div 2]>a[i] then begin a[0]:=a[i]; a[i]:=a[i div 2]; a[i div 2]:=a[0]; end else done:=true; until (2*i>l) or done; end; procedure delt(i:longint); var x,y:longint; begin x:=a[i]; y:=a[l]; dec(l); if i=l+1 then exit; a[i]:=y; if y<x then up(i) else down(i); end; procedure main; var i,j:longint; t:int64; begin l:=1; for i:=1 to n+1 do begin t:=a[1]; for j:=1 to k do if t*s[j]<maxlongint then inst(t*s[j]); delt(1); while t=a[1] do delt(1); end; writeln(t); end; begin readln(k,n); a[1]:=1; for i:=1 to k do read(s[i]); main; end.