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.

Download