USACO 3.1 Humble Numbers丑数

来源:互联网 发布:linux输入法设置中文 编辑:程序博客网 时间:2024/04/29 18:26

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 192 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.

0 0