// PascalABC.NET 3.3, сборка 1540 от 16.09.2017 // Внимание! Если программа не работает, обновите версию!
begin var n,p:integer; var s:string; for var a:=1 to 9 do for var b:=0 to 9 do for var c:=0 to 9 do begin n:=100*a+10*b+c; s:=(n*n).ToString.Right(3); p:=Pos(a.ToString,s); if p>0 then begin Delete(s,p,1); p:=Pos(b.ToString,s); if p>0 then begin Delete(s,p,1); if s=c.ToString then Write(n,'(',n*n,')',' ') end end end end.
Результат 205(42025) 376(141376) 421(177241) 625(390625) 963(927369)
Из условия Фано следует, что в префиксном неравномерном двоичном коде, предусматривающем однозначное декодирование, ни одно кодовое слово не может быть началом другого.
Таким образом, оставшиеся три кода не могут быть началом кода буквы Б, и началами кодов друг друга.
То есть коды 0 и 00 отпадают сразу, т.к. это начала буквы Б.
Если предположить, что один из кодов равен 1, и что нам нужны кратчайшие коды, значит оставшиеся коды могут быть только 01 и 011.
Если предположить, что коды двузначны, тогда кодами могут быть 01, 10 и 11.
В первом случае суммарная длина кодов равна 1+2+3+3 = 9, во втором случае - 2+2+2+3 = 9.
Оба варианта подходят, кратчайшая суммарная длина - 9
// Внимание! Если программа не работает, обновите версию!
begin
var n,p:integer;
var s:string;
for var a:=1 to 9 do
for var b:=0 to 9 do
for var c:=0 to 9 do begin
n:=100*a+10*b+c;
s:=(n*n).ToString.Right(3);
p:=Pos(a.ToString,s);
if p>0 then begin
Delete(s,p,1);
p:=Pos(b.ToString,s);
if p>0 then begin
Delete(s,p,1);
if s=c.ToString then Write(n,'(',n*n,')',' ')
end
end
end
end.
Результат
205(42025) 376(141376) 421(177241) 625(390625) 963(927369)