Олимпиадное задание. Стеки - Free Pascal
Формулировка задачи:
Помогите решить задачку через стеки :
'Есть одна последовательность, так называемая 'Треугольная' строится она следующим образом:
S(1) = { 1 };
S(2) = { 1,2,1 };
S(3) = { 1,2,1,3,1,2,1 };
S(n) = { S(n - 1), i, S(n - 1) };
Необходимо разработать способ, который будет находить число на k - й позиции в n - ом члене.
1 <= n,k <= 2^64;
Если в члене n нет такой позиции, т.е. k > length(S(n)) то вывести No solution.'
Решение задачи: «Олимпиадное задание. Стеки»
textual
Листинг программы
uses
SysUtils;
function f(k: QWord): Integer;
var
i: Integer;
begin
for i := 0 to 63 do
if k and (QWord(1) shl i) <> 0 then
exit(i + 1);
exit(65);
end;
var
sn, sk: String;
n, k: QWord;
begin
ReadLn(sn);
ReadLn(sk);
n := StrToQWordDef(sn, 0);
k := StrToQWordDef(sk, 0);
if (k = 0) and ((n = 0) or (n > 64)) then
WriteLn('65')
else if (n <> 0) and (k >= QWord(1) shl n) then
WriteLn('No solution')
else
WriteLn(f(k));
end.
Объяснение кода листинга программы
- В функции
f(k: QWord): Integer;реализован алгоритм проверки битовых полей числаkна наличие единицы в каждом из них. - В основной части программы считываются строки
snиsk, которые интерпретируются как числаnиkсоответственно. - Если
kравно нулю иnравно нулю или больше 64, то выводится число 65. - Если
nне равно нулю иkбольше или равноQWord(1) shl n, то выводится строкаNo solution. - В противном случае выводится результат работы функции
f(k).