
var
a, b, g, s: integer;
begin
readln(a, b);
if a mod 2 = 0 then
begin
if (b - a) mod 2 = 0 then
begin
g := (b - a) div 2;
s := a div 2 - g;
write(s, ' ', g);
end
else
write('-1 -1');
end
else
write('-1 -1');
end.
Объяснение:
Обозначим количество страусов через s, количество жирафов через g.
Тогда 2s + 2g = a, 2s + 4g = b.
Вычитая из второго уравнения первое, получим 2g = b - a,
откуда g = (b - a) / 2, при этом (b - a) должно быть кратно 2.
Теперь найдем из первого уравнения s = a / 2 - g, при этом a должно быть кратным 2.
Объяснение:
Это весьма неэффективный алгоритм вычисления количества подстрок l в строке s. Работает так:
1) Функция find ищет первое вхождение строки l в строку s: индекс начала вхождения pos. Например, s = "xxxabdcabd", l = "abd". Сделаем так:
int pos = s.find(l);
Первым вхождением строки l в строку s является выделенная часть: "xxxabdcabd". В переменной pos будет храниться индекс буквы a, то есть 3.
Если вхождения нет, то в pos будет находиться -1.
2) Если вхождение есть, то увеличиваем счетчик подстрок. Теперь нам нужно искать подстроку l в строке s, начиная с позиции pos+1. Для этого в коде исходная строка обрезается с функции substr. Была "xxxabdcabd", стала "bdcabd".
Пример: s = s.substr(3+1);
Теперь в строке s удалены символы с индексами от 0 до 3 включительно.
Далее снова ищем первое вхождение строки l в уже новой строке s:
"bdcabd". Увеличиваем счетчик, снова обрезаем строку. Теперь s = "bd".
Снова попытаемся найти первое вхождение строки "abd" в уже строку "bd". Вхождения нет, s.find(l) == -1, завершаем цикл.