Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on Aug 10th, 2012  |  syntax: None  |  size: 3.97 KB  |  hits: 5  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. {$mode objfpc}
  2. {$R-,Q-,S-,I-}
  3. {$inline on}
  4.  
  5.  
  6. const           maxN                    =       50000;
  7.                 maxD                    =       611953;
  8.                 maxS                    =       300000;
  9.  
  10.  
  11. type            TString                 =       ansistring;
  12.  
  13.  
  14. var             a                       :       array [1 .. maxN] of integer;
  15.                 avail                   :       array [1 .. maxD] of boolean;
  16.                 head                    :       array ['0' .. '9'] of integer;
  17.                 link                    :       array [1 .. maxS] of integer;
  18.                 res                     :       TString;
  19.                 n , k , m               :       integer;
  20.  
  21.  
  22. procedure enter; inline;
  23.         begin
  24.                 readln( n , k );
  25.                 fillchar( avail , sizeof( avail ) , true );
  26.         end;
  27.  
  28.  
  29. procedure GetPrime; inline;
  30.         var     i , j   :       integer;
  31.         begin
  32.                 for i := 2 to maxD do
  33.                 if avail[i] then
  34.                         begin
  35.                                 j := 1;
  36.                                 inc( m ); a[m] := i;
  37.                                 if m >= n then exit;
  38.                                 while i * j <= maxD do
  39.                                         begin
  40.                                                 avail[i * j] := false;
  41.                                                 inc( j );
  42.                                         end;
  43.                         end;
  44.         end;
  45.  
  46.  
  47. procedure init; inline;
  48.         var     i       :       integer;
  49.                 t       :       TString;
  50.         begin
  51.                 for i := 1 to n do
  52.                         begin
  53.                                 str( a[i] , t );
  54.                                 res := res + t;
  55.                         end;
  56.                 n := length( res );
  57.                 fillchar( avail , sizeof( avail ) , true );
  58.         end;
  59.  
  60.  
  61. procedure solve; inline;
  62.         var     i , j   :       integer;
  63.                 u       :       char;
  64.         begin
  65.                 for i := 1 to n do
  66.                         begin
  67.                                 if k <= 0 then exit;
  68.                                 link[i] := head[res[i]];
  69.                                 head[res[i]] := i;
  70.                                 for u := '0' to '9' do
  71.                                 if u < res[i] then
  72.                                         begin
  73.                                                 j := head[u];
  74.                                                 while j > 0 do
  75.                                                         begin
  76.                                                                 avail[j] := false;
  77.                                                                 dec( k );
  78.                                                                 if k <= 0 then exit;
  79.                                                                 j := link[j];
  80.                                                         end;
  81.                                                 head[u] := 0;
  82.                                         end
  83.                                 else
  84.                                         break;
  85.                         end;
  86.         end;
  87.  
  88.  
  89. procedure del; inline;
  90.         var     i       :       integer;
  91.         begin
  92.                 for i := n downto 1 do
  93.                 if avail[i] then
  94.                         begin
  95.                                 if k <= 0 then exit;
  96.                                 avail[i] := false;
  97.                                 dec( k );
  98.                         end;
  99.         end;
  100.  
  101.  
  102. procedure result; inline;
  103.         var     i       :       integer;
  104.         begin
  105.                 for i := 1 to n do
  106.                 if avail[i] then
  107.                         write( res[i] );
  108.         end;
  109.  
  110.  
  111. begin
  112.                 enter;
  113.                 GetPrime;
  114.                 init;
  115.                 solve;
  116.                 Del;
  117.                 result;
  118. end.