Тип 14 № 63030 

Кодирование чисел. Системы счисления. Операции в одной СС
i
В числе 57x692y1940 x и y обозначают некоторые цифры из алфавита системы счисления с основанием 40. Определите такие значения x и y, при которых приведённое число кратно 39, а число yx40 является полным квадратом. В ответе запишите значение числа yx40 в десятичной системе счисления.
Решение. Приведём решение на языке Python.
c = []
for x in range(40):
for y in range(40):
t = 5*40**8+7*40**7+x*40**6+6*40**5+9*40**4+2*40**3+y*40**2+1*40*1+9
if t % 39 == 0 and (y*40**1+x)**0.5==round((y*40**1+x)**0.5):
c.append(y*40**1+x)
print(max(c))
Ответ: 1521.
Приведём решение Юрия Красильникова на языке Python.
def num(digits,base):
n = 0
for d in digits:
n = n*base + d
return n
def square(n):
return int(n**0.5 + 0.5)**2 == n
a = [num([y,x],40) for x in range(40) for y in range(1,40) if num([5,7,x,6,9,2,y,1,9],40)%39==0 and square(num([y,x],40))]
print(max(a))
Примечание: В решении используется функция num(digits,base). digits — список целых чисел, содержащий числовые значений цифр числа в системе счисления по основанию base. Функция возвращает значение числа, записанного этими цифрами. Данная функция подходит для решений задач с любым основанием системы счисления, сколь угодно большим.
Приведём решение Сергея Донец на PascalABC.NET:
function ToNm(digs: array of integer; base: integer): int64;
begin Result := 0;
foreach var d in digs do // Схема Горнера
Result := Result * base + d;
end;
function IsSq(n: int64): boolean;
begin//Проверка на полный квадрат
var root := Trunc(Sqrt(n));
Result:=(root*root=n);
end;
begin
var p := 40;
var maxVal := -1;
for var x := 0 to p-1 do
for var y := 0 to p-1 do begin
var number:='57x692y19' // массив цифр числа
.Select(ch -> ch.IsDigit ? ch.ToDigit : ch = 'x'?x : ch = 'y'?y : 0)
.ToArray;
var num := ToNm(number, p);
if num mod (p-1) = 0 then begin
var yx := ToNm([y, x], p);//k=yx = y*p + x
if IsSq(yx) then maxVal := yx;end;
end;
maxVal.Print;//1521
end.
Ответ: 1521