Если код не важен, а нужно именно решение, то вот на привычном для меня C#
Идея в том, что мы просто симулируем поворот замка и смотрим что происходит.
int A = 2;
int B = 3;
int N = 3;
int K = 1;
int maxPos = N;
int currentPos = 1;
int countReachK = 0;
int countPairs = 0;
while (countReachK < K)
{
//Если надо приводим к нулю чтобы не считать пересечение два раза.
if ((currentPos == maxPos) && (A>0))
currentPos = 0;
currentPos += A;
//Проверка на пересечение или остановку.
while (currentPos >= maxPos)
{
currentPos -= maxPos;
countReachK++;
}
//Если надо приводим к максимуму чтобы не считать пересечение два раза.
if ((currentPos == 0) && (B>0))
currentPos = maxPos;
currentPos -= B;
//Проверка на пересечение или остановку.
while (currentPos <=0)
{
currentPos += maxPos;
countReachK++;
}
countPairs++;
}
if (countReachK != K)
countPairs = -1;
// countPairs и есть искомый результат.