FINDNUM - Tìm số

Tác giả: ladpro98

Ngôn ngữ: Pascal

uses    math;
const   p:array[1..10] of longint = (2,3,5,7,11,13,17,19,23,29);
        lim = trunc(1e18);
        fi = '';
        maxn = 1001;
var     f:array[0..maxn,0..10] of int64;
        pow:array[1..10,0..100] of int64;
        lg:array[1..10] of longint;
        i,j,k,n:longint;
        res,t:int64;
        inp:text;
begin
        assign(inp,fi);reset(inp);
        readln(inp,n);close(inp);
        for i:=1 to 10 do lg[i]:=trunc(logn(p[i],lim));
        for i:=1 to 10 do begin
                pow[i,0]:=1;
                for j:=1 to lg[i] do pow[i,j]:=p[i]*pow[i,j-1];
        end;
        f[1,0]:=1;
        for i:=1 to n do
        for j:=1 to 10 do begin
                f[i,j]:=lim;
                for k:=0 to lg[j] do begin
                        t:=f[i div (k+1),j-1];
                        if (i mod (k+1) = 0) and (i>k) and (t>0) and (f[i,j] div pow[j,k]>=t)then
                        f[i,j]:=f[i div (k+1),j-1]*pow[j,k];
                end;
        end;
        res:=lim;
        for j:=1 to 10 do res:=min(res,f[n,j]);
        write(res);
end.

Download