Cod sursa(job #228529)

Utilizator FllorynMitu Florin Danut Flloryn Data 7 decembrie 2008 14:14:51
Problema Divizori Primi Scor 75
Compilator fpc Status done
Runda Arhiva de probleme Marime 2.58 kb
program pascal;
var f,g:text; n,i,j,k,nr,t,mij,k0,k1,k2,k3,k4,k5,k6,k7,l:longint;
    v:array[1..1000000] of 0..1;
    x:array[1..1000000] of 0..9;
    a:array[0..7,1..1000000] of longint;
    ok:boolean;

    procedure formare;
    begin
      n:=1000000;
      for i:=2 to trunc(sqrt(n)) do
      if v[i]=0 then
        begin
        for j:=2 to (n div i) do
                begin
                v[i*j]:=1;
                inc(x[i*j]);
                end;
        end;

      x[1]:=0;
      k0:=1;
      a[0,k0]:=1;
      for i:=2 to n do
       begin
       if x[i]=0 then x[i]:=1;
       if x[i]=1 then
               begin
                inc(k1);
                a[x[i],k1]:=i;
               end
       else
       if x[i]=2 then
                begin
                 inc(k2);
                 a[x[i],k2]:=i;
                end
       else
       if x[i]=3 then
                    begin
                     inc(k3);
                     a[x[i],k3]:=i;
                    end
       else
       if x[i]=4 then
                  begin
                   inc(k4);
                   a[x[i],k4]:=i;
                  end
       else
       if x[i]=5 then
                  begin
                  inc(k5);
                  a[x[i],k5]:=i;
                  end
       else
       if x[i]=6 then
                 begin
                 inc(k6);
                 a[x[i],k6]:=i;
                 end
      else
      if x[i]=7 then
                begin
                 inc(k7);
                 a[x[i],k7]:=i;
                end;

     end;
   end;

   procedure val(s,d:longint);
   begin
   ok:=false;
   while (s<=d) and (not ok) do
    begin
    mij:=(s+d) div 2;
    if a[k,mij]=n then ok:=true
         else
         if a[k,mij]>n then d:=mij-1
                       else s:=mij+1;
    end;
   end;

begin
assign(f,'divprim.in'); reset(f);
assign(g,'divprim.out'); rewrite(g);
k0:=0; k1:=0; k2:=0; k3:=0; k4:=0; k5:=0; k6:=0; k7:=0;
formare;
readln(f,t);
for nr:=1 to t do
 begin
   readln(f,n,k);
        if k=0 then l:=k0
   else if k=1 then l:=k1
   else if k=2 then l:=k2
   else if k=3 then l:=k3
   else if k=4 then l:=k4
   else if k=5 then l:=k5
   else if k=6 then l:=k6
   else if k=7 then l:=k7;
   val(1,l);
   if ok then writeln(g,a[k,mij])
   else
   if a[k,mij]>n then
    begin
    mij:=mij-1;
    while (mij<>0) and (a[k,mij]>n) do mij:=mij-1;
    if mij=0 then writeln(g,0)
             else writeln(g,a[k,mij]);
     end
      else writeln(g,a[k,mij]);
  end;

close(f);
close(g);
end.