Задача Иосифа Флавия или считалка Джозефуса


Некоторые способы оптимизации циклических алгоритмов и структуры данных

Дунидин Дмиттрий Валерьевич, 8М класс.
г.Тольятти, МБУ лицей №6

Рассматриваются различные способы оптимизации программ при решении задач с вложенными циклами на примере решения известной задачи “Считалка”.


Задача Иосифа Флавия или считалка Джозефуса — известная математическая задача с историческим подтекстом. Задача основана на легенде, что отряд Иосифа Флавия, защищавший город Йодфат, не пожелал сдаваться в плен блокировавшим пещеру превосходящим силам римлян. Воины, в составе сорока человек, стали по кругу и договорились, что каждые два воина будут убивать третьего, пока не погибнут все. При этом двое воинов, оставшихся последними в живых, должны были убить друг друга. Иосиф Флавий, командовавший этим отрядом, якобы быстро рассчитал, где нужно встать ему и его товарищу, чтобы остаться последними, но не для того, чтобы убить друг друга, а чтобы сдать крепость римлянам.

В современной формулировке задачи участвует n воинов, стоящих по кругу, и убивают каждого m-го. Требуется определить номер k начальной позиции воина, который останется последним.

Задача: Вокруг считающего стоят N человек, один из которых назван первым, а остальные занумерованы по часовой стрелке от 2 до N. Считающий, начиная с первого, ведет счет до S. Человеку, на котором остановился счет, отрубают голову. Счет продолжается до следующего человека, и остающиеся продолжают считаться так до тех пор, пока не останется один человек. Определить порядок выбывания считающихся из круга.