Прошу быстрее!!! Задача на C++
Родители Лизы подключили пакет, содержащий N телевизионных каналов, пронумерованных числами от 1 до N.
Переключать каналы можно с помощью двух кнопок на пульте: «+» и «–».
Короткое нажатие на кнопку «+» приведёт к переключению на следующий канал, если номер текущего канала меньше N; если же номер текущего канала равен N, то телевизор продолжит показывать этот канал. Если кнопку «+» нажать и удерживать некоторое время, произойдёт переход на K каналов вперёд, при условии, что номер текущего канала не превосходит N – K. В противном случае произойдёт переход на канал N.
Аналогично, короткое нажатие на кнопку «–» приведёт к переключению на предыдущий канал, если номер текущего канала больше 1; если же номер текущего канала равен 1, телевизор продолжит показывать этот канал. Если кнопку «–» нажать и удерживать некоторое время, то произойдёт переход на K каналов назад при условии, что номер текущего канала превышает K. В противном случае произойдёт переход на канал 1.
Лиза включила телевизор и обнаружила, что он показывает канал P. Лиза знает, что очень скоро по каналу с номером U начнётся интересная передача. Определите, какое минимальное количество нажатий на кнопки пульта потребуется сделать Лизе, чтобы переключиться на канал U.
Формат выходных данных
В первой строке содержится целое число N (3 ≤ N ≤ 109) — количество телевизионных каналов.
Во второй строке содержится целое число K (2 ≤ K < N) — количество каналов, на которое осуществится переход назад или вперёд при удерживании соответствующей кнопки переключения.
В третьей строке содержится целое число P (1 ≤ P ≤ N) — номер канала, который показывает телевизор.
В четвёртой строке содержится целое число U (1 ≤ U ≤ N) — номер канала, на который желает переключиться Лиза.
Гарантируется, что P ≠ U.
Формат выходных данных
Выведите одно целое неотрицательное число — минимальное количество нажатий на кнопки пульта, которое необходимо для переключения с канала P на канал U.

Странно что такую интересную задачку никто не порешал.
Вот мой вариант решения, надеюсь не слишком поздно.
#include<cmath>
#include <iostream>
//dist1 - расстояние до промежуточной точки в которой меняется кратность
//dist2 - расстояние от променжуточной до финальной точки
// k - шаг
int path(int dist1, int dist2, int k ){
return dist1/k + (dist1%k==0?0:1) + dist2/k+ std::min( dist2%k, 1+k-dist2%k);
}
int save_the_world(int n, int s, int p, int k){
if(s>p ) std::swap(s,p); // чтобы не считать абсолютные пути
if(s==p) return 0;
int direct = path(0 ,p-s,k);
int via1 = path(s-1,p-1,k);
int viaN = path(n-s,n-p,k);
return std::min(std::min(direct,via1),viaN);
}
int main(){
int N, K ,P,U;
std::cin >> N>>K>>P>>U;
std::cout << save_the_world(N,P,U,K);
return 0;
}
Быстрее чата общеизвестного нет. А я даже читать это не хочу, так как длинные задания тут редко кто читает.