KDEL - Xóa số
Tác giả: ladpro98
Ngôn ngữ: Pascal
program kdel;
uses math,sysutils;
type element = record
pos:longint;
val:char;
end;
const maxV = 1000000;
fi='';
fo='';
var s,res:ansistring;
sieve:array[1..maxV] of boolean;
prime:array[1..maxV] of longint;
stack:array[1..maxV] of element;
k,n,d,head,tail,tpos:longint;
oup,inp:text;
procedure initStack;
begin
head:=1;
tail:=0;
end;
function isEmpty:boolean;
begin
exit((tail-head)<0);
end;
function popHead:char;
begin
inc(head);
exit(stack[head-1].val);
end;
function popTail:char;
begin
dec(tail);
exit(stack[tail+1].val);
end;
procedure pushTail(i:longint);
begin
inc(tail);
stack[tail].val:=s[i];
stack[tail].pos:=i;
end;
function isPrime(n:int64):boolean;
var i:longint;
begin
for i:=2 to trunc(sqrt(n)) do
if n mod i=0 then exit(false);
exit(true);
end;
procedure initsieve;
var i,j:longint;
begin
fillchar(sieve,sizeof(sieve),true);
d:=0;
i:=2;
while i<=1000000 do
begin
if sieve[i] then
begin
j:=i+i;
while j<=1000000 do
begin
sieve[j]:=false;
inc(j,i);
end;
inc(d);
prime[d]:=i;
if d=50000 then exit;
end;
inc(i);
end;
end;
procedure initString;
var i:longint;
begin
for i:=1 to n do
s:=s+IntToStr(prime[i]);
end;
function findmax(i,j:longint):longint;
var c,k:longint;
begin
while (not isEmpty) and (stack[head].pos<i) do popHead;
for c:=tpos+1 to j do
begin
while (not isEmpty) and (stack[tail].val<s[c]) do popTail;
pushTail(c);
end;
exit(stack[head].pos);
end;
procedure processDel;
var pos,i,last:longint;
begin
pos:=1;
last:=k+1;
tpos:=0;
for i:=1 to length(s)-k do
begin
pos:=findmax(pos,last);
tpos:=last;
write(oup,s[pos]);
inc(pos);
inc(last);
end;
end;
procedure input;
begin
assign(inp,fi);
reset(inp);
readln(inp,n,k);
//readln(inp,s);
close(inp);
assign(oup,fo);
rewrite(oup);
end;
begin
input;
initSieve;
initString;
initStack;
processDel;
close(oup);
end.