program skaitmenu_suma_ir_sandauga;
   const MAX = 15; { kad tilpt— integer tipo ižskaidyta skaitmenimis sandauga }
   type skaitmuo = 0..9;
        skaicius = array [0..MAX] of skaitmuo;

  procedure naujas (var sk: skaicius; var galima : boolean);
   { suranda nauj… skai‡i—, didesn u‘ priež buvus ir }
   { kurio visi skaitmenys ižd‚styti nema‘‚jan‡iai }
     var skm, i: integer;
  begin
    galima := true;
    skm := MAX;
    while (sk[skm] = 9) and (skm <> 0) do
       skm := skm - 1;
    { skaitmen— sumos minimumas }
    if skm <> 0
      then begin
             sk[skm] := sk[skm] + 1; { didiname atitinkam… skaitmen }
             for i := skm + 1 to MAX do  { tada sulyginame  dežinŠ }
                 sk[i] := sk[skm]         { esan‡ius skaitmenis }
           end
       else galima := false
  end;

  procedure maziausias_skaicius (sum, san : integer;
                                 var sk : skaicius; var rasta : boolean;
                                 var dalis : skaicius; var vienetai : integer);
  { jei skai‡iaus nerasta, bet jo sandauga ižskaidoma skaitmenimis, }
  { o skaitmen— suma gana didel‚, tuomet iežkomas skai‡ius bus sudarytas }
  { iž rasto skai‡iaus dalis ir priekyje esanciu vienet— }

     var ssum, ssan, i : integer;
         galima, pirmas : boolean;
   begin
     { tikriname, ar duot… sandaug… galima ižskaidyti skaitmen— sandauga; }
     { jei negalima, toliau n‚ra prasm‚s iežkoti norimo rezultato }
       ssan := san; i := 2;
       while (i < 9) and (ssan > 9) do
          if ssan mod i = 0
             then ssan := ssan div i
             else i := i + 1;
       rasta := ssan <= 9;
     {===================================================================}
     for i := 0 to MAX do
        sk[i] := 0;
     sk[max] := 1; { sugeneruojame pirm…j skai‡i— }
     ssum := 1; ssan := 1;
     vienetai := 0;
     pirmas := true; { reikalingas tik pirm… kart… rastas skai‡ius, }
                     { kurio skaitmen— sandauga tenkina s…lyg… }
     galima := true; { galima sudaryti didesn skai‡i— }
     while galima and ((ssum <> sum) or (ssan <> san) and (san <> 0)) do
       begin
         naujas (sk, galima);
         { rasime sk skaitmenu sum… ir sandaug… }
         ssum := 0; ssan := 1;
         for i := 1 to max do
          begin
            ssum := ssum + sk[i];
            if sk[i] <> 0
               then if (ssan <= maxint div sk[i])
                       then ssan := ssan * sk[i]
                       else ssan := 0;
          end;
         { pasi‘ymime pirm…j skai‡i—, kurio skaitmen— sandauga }
         { tenkina s…lyga, o skaitmen— suma - ne (yra me‘esn‚) }
         if (ssan = san) and (ssum < sum) and pirmas
            then begin
                   dalis := sk;
                   vienetai := sum - ssum;
                   pirmas := false
                end
       end;
     if san = 0 { terpiame nul priež pirm… skai‡i— }
        then begin
               i := 1;
               while sk[i] = 0 do
                 i := i + 1;
               sk[i - 1] := sk[i];
               sk[i] := 0;
             end;
     rasta := (ssum = sum) and (ssan = san) or (san = 0)
   end;

   var sum, san, vienetai, i, j : integer;
       sk, dalis : skaicius;
       rasta : boolean;
begin  { programa }
   read (sum, san);
   maziausias_skaicius (sum, san, sk, rasta, dalis, vienetai);
   { rezultat— spausdinimas }
   if rasta
      then begin
             i := 1;
             while sk[i] = 0 do
               i := i + 1;
             for j := i to MAX do
               write (sk[j])
           end
      else if vienetai <> 0  { yra skai‡ius, kurio skaitmen— sandauga tenkina s…lyg… }
              then begin
                     for i := 1 to vienetai do
                       write ('1');
                     for i := 1 to MAX do
                       if dalis[i] <> 0
                          then write (dalis[i]);
                   end
              else writeln ('N‚ra sprendinio');
  writeln;
end.










