Cod sursa(job #251503)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 2 februarie 2009 20:41:16
Problema GFact Scor 90
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.87 kb
program alex;
var f:text;
    c,exp:array[1..500000]of longint;
    p,q,n,k,i:longint;
    li,ls,m,x,s:int64;
    e:boolean;
begin
assign(f,'gfact.in');reset(f);
readln(f,p,q);
close(f);
n:=p;
k:=0;
if n mod 2=0 then begin
                  k:=k+1;
                  c[k]:=2;
                  while n mod 2=0 do
                        begin
                        exp[k]:=exp[k]+1;
                        n:=n div 2;
                        end;
                  end;
exp[k]:=exp[k]*q;
i:=3;
while(i*i<=n)and(n<>1)do
      begin
      if n mod i=0 then begin
                        k:=k+1;
                        c[k]:=i;
                        while n mod i=0 do
                              begin
                              exp[k]:=exp[k]+1;
                              n:=n div i;
                              end;
                        exp[k]:=exp[k]*q;
                         end;
      i:=i+2;
      end;
if n>1 then begin
            k:=k+1;
            c[k]:=n;
            exp[k]:=exp[k]+1;
            exp[k]:=exp[k]*q;
            end;
li:=c[k];
ls:=c[k]*exp[k];
m:=(li+ls)div 2;
while li<=ls do
      begin
      e:=true;
      for i:=1 to k do
          begin
          x:=c[i];
          s:=0;
          while m div x<>0 do
                begin
                s:=s+m div x;
                x:=x*c[i];
                end;
          if s<exp[i] then begin
                           e:=false;
                           break;
                           end;
          end;
      if e=false then begin
                      li:=m+1;
                      m:=(li+ls)div 2;
                      end
                  else begin
                       ls:=m-1;
                       m:=(li+ls)div 2;
                       end;
      end;
assign(f,'gfact.out');rewrite(f);
writeln(f,m+1);
close(f);
end.