using System.Collections.Generic;
private static void Main(string[] args)
while((read = Console.ReadLine().Trim()) != "0 0 0")
string[] row = read.Split();
int amount = Convert.ToInt32(row[0]);
int k = Convert.ToInt32(row[1]);
int m = Convert.ToInt32(row[2]);
InternPicker internPicker = new InternPicker(amount, k, m);
InternResultBuilder internResultBuilder = new InternResultBuilder();
while(internPicker.GetNext(out int clockWise, out int antiClockwise))
internResultBuilder.Add(clockWise, antiClockwise);
Console.WriteLine(internResultBuilder.GetResult());
public class InternPicker
private readonly int _amountInterns;
private readonly int _clockwiseAmount;
private readonly int _anticlockwiseAmount;
private readonly List<int> interns;
private readonly List<int> internsRemoved;
private int clockwisePointer;
private int antiClockwisePointer;
public InternPicker(int amountInterns, int clockwiseAmount, int anticlockwiseAmount)
_amountInterns = amountInterns;
_clockwiseAmount = clockwiseAmount;
_anticlockwiseAmount = anticlockwiseAmount;
interns = Enumerable.Range(1, amountInterns).ToList();
internsRemoved = new List<int>();
antiClockwisePointer = amountInterns-1;
public bool GetNext(out int clockwise, out int antiClockwise)
if(internsRemoved.Count == _amountInterns)
WalkWithClockwisePointer(_clockwiseAmount-1);
WalkWithAntiClockwisePointer(_anticlockwiseAmount-1);
clockwise = interns[clockwisePointer];
antiClockwise = interns[antiClockwisePointer];
internsRemoved.Add(clockwisePointer);
if(antiClockwisePointer != clockwisePointer)
internsRemoved.Add(antiClockwisePointer);
if (internsRemoved.Count == _amountInterns)
WalkWithClockwisePointer(1);
WalkWithAntiClockwisePointer(1);
private void WalkWithClockwisePointer(int amount)
for(int i = 0; i < amount; i++)
clockwisePointer = (clockwisePointer + 1) % _amountInterns;
while (internsRemoved.Contains(clockwisePointer))
clockwisePointer = (clockwisePointer + 1) % _amountInterns;
private void WalkWithAntiClockwisePointer(int amount)
for (int i = 0; i < amount; i++)
antiClockwisePointer = ((antiClockwisePointer - 1) + _amountInterns) % _amountInterns;
while (internsRemoved.Contains(antiClockwisePointer))
antiClockwisePointer = ((antiClockwisePointer - 1) + _amountInterns) % _amountInterns;
public class InternResultBuilder
private List<string> results;
public InternResultBuilder()
results = new List<string>();
public void Add(int valueClockwise, int valueAntiClockwise)
if (valueClockwise == valueAntiClockwise)
results.Add(Format(valueClockwise));
results.Add($"{Format(valueClockwise)}{Format(valueAntiClockwise)}");
public string GetResult()
return string.Join(",", results);
private static string Format(int value)
return value.ToString().PadLeft(3);