program pazzle;
{$mode objfpc}{$H+}
uses
SysUtils;
type
TPermState = record
case Boolean of
False: (Dw: DWord);
True: (Bits: bitpacked array[0..9] of Boolean);
end;
procedure Solve;
var
State: TPermState;
E, I, K, L, M, N, R, S, T, Count: Integer;
function IsSolution: Boolean;
begin
Result := (N + E * 10 + N * 100 + E * 1000 + K * 10000 + E * 100000 + R * 1000000) +
(T + E * 10 + M * 100) * (N + E * 10 + I * 100 + T * 1000) -
(S + R * 10 + E * 100 + T * 1000 + T * 10000 + E * 100000 + L * 1000000) =
T + S * 10 + R * 100 + E * 1000 + K * 10000;
end;
function CalcREKENLES: Int64;
begin
Result := Int64(S) + Int64(E) * 10 + Int64(L) * 100 + Int64(N) * 1000 + Int64(E) * 10000 +
Int64(K) * 100000 + Int64(E) * 1000000 + Int64(R) * 10000000;
end;
var
REKENLES1, REKENLES2: Int64;
begin
State.Dw := 1023;
Count := 0;
REKENLES1 := 0;
REKENLES2 := 0;
for N := 0 to 9 do
begin
State.Bits[N] := False;
for S := 0 to 9 do
if State.Bits[S] then
begin
State.Bits[S] := False;
for T := 0 to 9 do
if State.Bits[T] then
begin
if (10 - S + N * Succ(T)) mod 10 <> T then
continue;
State.Bits[T] := False;
for E := 0 to 9 do
if State.Bits[E] then
begin
State.Bits[E] := False;
for I := 0 to 9 do
if State.Bits[I] then
begin
State.Bits[I] := False;
for K := 0 to 9 do
if State.Bits[K] then
begin
State.Bits[K] := False;
for L := 0 to 9 do
if State.Bits[L] then
begin
State.Bits[L] := False;
for M := 0 to 9 do
if State.Bits[M] then
begin
State.Bits[M] := False;
for R := 0 to 9 do
if State.Bits[R] then
if IsSolution then
begin
Inc(Count);
Write('K=',K);
Write(', E=',E);
Write(', R=',R);
Write(', S=',S);
Write(', T=',T);
Write(', N=',N);
Write(', M=',M);
Write(', I=',I);
Write(', L=',L);
Write(' MINSTREEL=',M,I,N,S,T,R,E,E,L,', ');
WriteLn('REKENLES=',R,E,K,E,N,L,E,S);
if Count = 1 then
REKENLES1 := CalcREKENLES;
if Count = 2 then
begin
REKENLES2 := CalcREKENLES;
WriteLn(REKENLES1,' * ', REKENLES2,' = ',
REKENLES1 * REKENLES2);
exit;
end;
end;
State.Bits[M] := True;
end;
State.Bits[L] := True;
end;
State.Bits[K] := True;
end;
State.Bits[I] := True;
end;
State.Bits[E] := True;
end;
State.Bits[T] := True;
end;
State.Bits[S] := True;
end;
State.Bits[N] := True;
end;
end;
var
Ticks: QWord;
begin
Ticks := GetTickCount64;
Solve;
Ticks := GetTickCount64 - Ticks;
WriteLn('tick count = ', Ticks);
ReadLn;
end.