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


Проанализировав счет по элементам массива, мы заметили, что если S – число, до которого считать, – большое, то программа пересчитывает одни и те же элементы несколько раз.


N = 7
S = 26
  1. M = (1, 1, 1, 1, 1, 1, 1). Выбывший элемент – 5.

При S = 26 мы при пересчете получаем тот же результат, что и при S = 5.

А это остаток от деления S на N. (26 % 7 = 5)

Дальше мы продолжали считать уже 6 элементов массива:

  1. M = (1, 1, 1, 1, 0, 1, 1). Выбывший элемент – 7.

Следовательно, в варианте 1 можно считать элементы не до S, а до h:=S % e, где e – число элементов, которое осталось удалить.


Однако этот алгоритм недостаточно быстро выполняется. Сравнительная скорость этого алгоритма зависит от вводимых чисел: при некоторых значениях скорость его практически не отличается от скорости первого алгоритма (при шаге считалки меньше количества элементов), но в некоторых случаях дает большой выигрыш в скорости (при шаге считалки намного больше количества элементов).


Всё равно эта программа медленно работает:
для n=2000, s=2000 время – 145 миллисекунд.
для n=10000, s=10000 – 2,9 секунд.