Представим куб в виде графа его каркаса. Пронумеруем все вершины куба цифрами от 1 до 8. Задача сводится к обычному обходу в ширину. Для четных N ответ будет 0, т.к. нельзя дойти на противоположную вершину за четное кол-во шагов. ответ будет расти в геометрической прогрессии в зависимости от N. Программа:
var n, i, j, k: integer; a: array[0..100, 1..8] of int64; begin read(n); a[0, 1] := 1; for k := 1 to n do for i := 1 to 8 do for j := 1 to 8 do if m[i, j] = 1 then a[k, i] := a[k, i] + a[k - 1, j]; write(a[n, 8]); end.
Так как может возникнуть ситуация, что ровно треть мальчиков от всех учеников сделать не получиться, то используем приём со сравнением числа с дробной частью и без дробной части в числе. Если дробная часть есть, то прибавляем еще одного принятого, чтобы было чуть больше трети от всех.
Пример:
n=59
k=10
pd=14,5
pc=trunc(14,5)=14
{функция trunc полностью отбрасывает дробную часть (не округляет!)}
pd>pc?
Да!
Значит
pc=14+1=15
Считаем.
Если бы мы не добавили к pc единицу, то получилось бы:
const
m: array[1..8, 1..8] of byte =
((0, 1, 1, 1, 0, 0, 0, 0),
(1, 0, 0, 0, 1, 0, 1, 0),
(1, 0, 0, 0, 1, 1, 0, 0),
(1, 0, 0, 0, 0, 1, 1, 0),
(0, 1, 1, 0, 0, 0, 0, 1),
(0, 0, 1, 1, 0, 0, 0, 1),
(0, 1, 0, 1, 0, 0, 0, 1),
(0, 0, 0, 0, 1, 1, 1, 0));
var
n, i, j, k: integer;
a: array[0..100, 1..8] of int64;
begin
read(n);
a[0, 1] := 1;
for k := 1 to n do
for i := 1 to 8 do
for j := 1 to 8 do
if m[i, j] = 1 then
a[k, i] := a[k, i] + a[k - 1, j];
write(a[n, 8]);
end.
program balet;
uses
crt;
var
k, n, pc: integer;
var
pd: real;
begin
readln(n);
readln(k);
pd := (n - 3 * k) / 2;
pc := trunc(pd);
if (pd > pc) then
pc := pc + 1 ;
writeln(pc);
readln;
end.
Пояснения:
pc - целое число принятых
pd - дробное число принятых
Так как может возникнуть ситуация, что ровно треть мальчиков от всех учеников сделать не получиться, то используем приём со сравнением числа с дробной частью и без дробной части в числе. Если дробная часть есть, то прибавляем еще одного принятого, чтобы было чуть больше трети от всех.
Пример:
n=59
k=10
pd=14,5
pc=trunc(14,5)=14
{функция trunc полностью отбрасывает дробную часть (не округляет!)}
pd>pc?
Да!
Значит
pc=14+1=15
Считаем.
Если бы мы не добавили к pc единицу, то получилось бы:
А это немного не треть...
А так как мы добавили единицу, то получилось:
То что нам надо!