решите ,завтра нужно сдать ,очень нужно с решением. Два игрока, Петя и Ваня, играют в следующую игру. Перед игроками лежат две кучи камней.
Игроки ходят по очереди, первый ход делает Петя. За один ход игрок может
a) добавить в одну из куч (по своему выбору) два камня или
б) увеличить количество камней в куче в три раза.
Победителем считается игрок, сделавший последний ход, т.е. первым получивший такую позицию,
что в обеих кучах всего будет 48 камней или больше.
Задание 1. Для каждой из начальных позиций (5, 14), (7, 13) укажите, кто из игроков имеет
выигрышную стратегию.
Задание 2. Для каждой из начальных позиций (5, 13), (6,13), (7,11) укажите, кто из игроков имеет
выигрышную стратегию.
Задание 3. Для начальной позиции (6,12) укажите, кто из игроков имеет выигрышную стратегию.
Постройте дерево всех партий, возможных при указанной выигрышной стратегии.
//PascalABC.NET (версия 3.1, сборка 1210 от 29.03.2016)
var n,i,m:integer;
flag:boolean;
begin
readln(n);
flag:=false;
if (n mod 2<>0)then i:=n-1 else i:=n;
while i>0 do begin
if power(2,i)<=n then begin
write(power(2,i),' '); flag:=true;
end;
i:=i-2;
end;
if not flag then writeln(0);
end.
Тест №1
1025
1024 256 64 16 4
Тест №2
1
0
Вариант №2
var a,i,n: integer;
begin
a:=1;readln(n);
i:=trunc(log2(n)); //получим степень двойки для n
//если i нечетное,
//то первое искомое число получаем путем сдвига влево на i-1 в
//двоичном представлении числа иначе сдвиг на i
if (i mod 2)=1 then a:=a shl(i-1) else a:=a shl i;
//далее получаем числа сдвигая вправо на 2 разряда
//в двоичном представлении числа
while a>=2 do begin
write(a,' ');
a:=a shr 2;
end;
end.
Тестовое решение:
2147483647
1073741824 268435456 67108864 16777216 4194304 1048576 262144 65536 16384 4096 1024 256 64 16 4
ответ:Вариант №1 (не совсем удачный, как было отмечено в комментариях).
//PascalABC.NET (версия 3.1, сборка 1210 от 29.03.2016)
var n,i,m:integer;
flag:boolean;
begin
readln(n);
flag:=false;
if (n mod 2<>0)then i:=n-1 else i:=n;
while i>0 do begin
if power(2,i)<=n then begin
write(power(2,i),' '); flag:=true;
end;
i:=i-2;
end;
if not flag then writeln(0);
end.
Тест №1
1025
1024 256 64 16 4
Тест №2
1
0
Вариант №2
var a,i,n: integer;
begin
a:=1;readln(n);
i:=trunc(log2(n)); //получим степень двойки для n
//если i нечетное,
//то первое искомое число получаем путем сдвига влево на i-1 в
//двоичном представлении числа иначе сдвиг на i
if (i mod 2)=1 then a:=a shl(i-1) else a:=a shl i;
//далее получаем числа сдвигая вправо на 2 разряда
//в двоичном представлении числа
while a>=2 do begin
write(a,' ');
a:=a shr 2;
end;
end.
Тестовое решение:
2147483647
1073741824 268435456 67108864 16777216 4194304 1048576 262144 65536 16384 4096 1024 256 64 16 4