Задача Иосифа Флавия — задача, входящая в одну из ранних работ по занимательной математике (1612 года) Баше де Мезириака. Задача заключается в следующем: по кругу стоит 41 воин, начиная с первого воина они убивают каждого третьего. Спрашивается, в каком месте нужно встать, чтобы остаться последним выжившим. В более общей формулировке участвует n воинов, которые считаются по кругу, и убивают каждого m-го.
Название задачи восходит к истории, случившейся с Иосифом Флавием во время Иудейской войны.
 Эта задача известна с 1612 года, когда французский математик Баше опубликовал эту задачу в своём сборнике Problem es Plaisants. Сюжет задачи основан на истории, описанной Иосифом Флавием в своём историческом труде «Иудейская война».
 Согласно этой истории, Иосиф Флавий со своим отрядом из сорока человек после падения Йодфата скрылся в пещере, но был обнаружен римлянами.
Все в отряде, кроме Иосифа, предпочли совершить самоубийство, но не сдаваться в плен.
Иосиф пытался отклонить своих товарищей от самоубийства. Однако они обвиняли его в трусости и хотели убить своего командира.
Далее Иосиф (говоря о себе в третьем лице) пишет:
 И в этом тяжёлом положении Иосифа не покинуло его благоразумие: в надежде на милость Божию он решил рискнуть своей жизнью и сказал: «Раз решено умереть, так давайте предоставим жребию решить, кто кого должен убивать. Тот, на кого падёт жребий, умрёт от рук ближайшего за ним, и таким образом мы все по очереди примем смерть один от другого и избегнем необходимости сами убивать себя; будет, конечно, несправедливо, если после того, как другие уже умрут, один раздумает и останется в живых». Этим предложением он вновь возвратил себе их доверие; уговорив других, он сам также участвовал с ними в жребии. Каждый, на которого пал жребий, по очереди добровольно дал себя заколоть другому, последовавшему за ним товарищу, так как вскоре за тем должен был умереть также и полководец, а смерть вместе с Иосифом казалась им лучше жизни. По счастливой ли случайности, а быть может по божественному предопределению, остался последним именно Иосиф ещё с одним. А так как он не хотел ни самому быть убитым по жребию, ни запятнать свои руки кровью соотечественника, то он убедил и последнего сдаться римлянам и сохранить себе жизнь.Иосиф Флавий. Иудейская война, книга 3, глава 8, 7 В задаче Баше солдаты не бросают жребий, а встают по кругу и убивают каждого третьего. В этом случае у Иосифа появляется возможность не полагаться на волю случая, а гарантировано спастись. Баше спрашивает, где нужно встать Иосифу и его товарищу, чтобы остаться последними, на кого выпадет жребий.
 Задача вдохновила Станислава Улама на создание понятия счастливого числа.
 На решении задачи Иосифа для 
  
    
      
        m
        =
        2
      
    
    {\displaystyle m=2}
  
 основан фокус «Love Ritual», созданный испанским фокусником Вуди Арагоном, который показывают Пенн и Теллер.
 Если известно решение задачи для некоторого числа воинов, то его можно использовать для решения задачи с на единицу большим числом воинов.
 Для 
  
    
      
        m
        =
        2
      
    
    {\displaystyle m=2}
  
 имеем
 Для 
  
    
      
        m
        =
        3
      
    
    {\displaystyle m=3}
  
 имеем
 Очевидно для общего случая будем иметь
 Возможно построение рекуррентных соотношений, которые сходятся намного быстрее чем линейные. Вот пример решения задачи для 
  
    
      
        m
        =
        2
      
    
    {\displaystyle m=2}
  
 с логарифмическим числом шагов рекурсии:
 При программировании приведенные выше рекуррентные соотношения дают вычислительную сложность 
  
    
      
        O
        (
        n
        )
      
    
    {\displaystyle O(n)}
  
 и 
  
    
      
        O
        (
        log
        ⁡
        n
        )
      
    
    {\displaystyle O(\log n)}
  
 соответственно. Получение решения в виде формулы должно приводить к алгоритмам, в которых вычислительная сложность минимальна — 
  
    
      
        O
        (
        1
        )
      
    
    {\displaystyle O(1)}
  
, т. е. вообще не зависит от 
  
    
      
        n
      
    
    {\displaystyle n}
  
 и 
  
    
      
        m
      
    
    {\displaystyle m}
  
 (длина записи представления чисел в системе счисления не учитывается). Нахождение таких формул крайне желательно и для данной задачи.
 Для 
  
    
      
        m
        =
        2
      
    
    {\displaystyle m=2}
  
 существует простая формула:
 Рассмотрим ещё два способа решения задачи, не опирающихся на приведенную выше формулу. Несмотря на то, что они сложнее для вычисления в плане вычислительной скорости, всё же эти алгоритмы более наглядны.
 Будем хранить в массиве имена (то есть номера) всех живых на текущий момент воинов. Номера людей были записаны в элементах массива с 0 по N — 1 (это свойство будет использоваться для операции взятия остатка). Когда воин будет умирать, будем удалять его из массива, и тех, кто стоял за ним, «сдвигать» на один элемент влево.
 Заметим, что если мы уже убили L человек, то в живых осталось M = N — L. Пусть мы только что (на L-ом шаге) убили человека, который был записан в нашем массиве в элементе с номером j (и сдвинули людей, которые были записаны в массиве в элементах с j + 1 по M на один элемент влево). Тогда следующим нужно убивать человека, который записан в этом массиве в элементе с номером (j + k — 1) % M.
 Заведем массив, где будем помечать мёртвых воинов (то есть в элементе i хранится, жив воин i, или уже нет). Пусть у нас на текущем шаге M живых людей, а на предыдущем шаге умер воин j. Чтобы найти следующего, будем бежать по массиву, отсчитывая живых и пропуская мёртвых. Тот человек, на котором мы насчитаем k % M, и должен умереть следующим. Через N — 1 шагов останется один человек.
 Простейшее моделирование будет работать за 
  
    
      
        O
        (
        
          N
          
            2
          
        
        )
      
    
    {\displaystyle O(N^{2})}
  
. Используя дерево отрезков, можно произвести моделирование за 
  
    
      
        O
        (
        N
        l
        o
        g
        N
        )
      
    
    {\displaystyle O(NlogN)}
  
.
Однако попытаемся найти закономерность, выражающую ответ для задачи (N,K) через решение предыдущих задач.
С помощью моделирования построим таблицу значений, скажем, приведенную ниже.
 
И здесь достаточно отчётливо видна следующая закономерность:
 (здесь индексация с единицы несколько портит элегантность формулы)
 Итак, мы нашли решение задачи Иосифа Флавия, работающее за 
  
    
      
        O
        (
        N
        )
      
    
    {\displaystyle O(N)}
  
 итераций.
 С целью подробного объяснения возможных ситуаций, которые могут возникнуть в ходе решения, упростим исходную задачу и рассмотрим случай № 1, причем, уменьшим круг солдат с сорока одного (сорок солдат и Иосиф) до десяти и предположим, что вместо каждого третьего солдата должен умереть каждый второй. В результате будем рассматривать круг солдат, изображённый на рис 1.
 Если производить отсчет от 1-го солдата в круге, то порядок удаления будет следующим:
2, 4, 6, 8, 10, 3, 7, 1, 9. Солдат под номером 5 — в конечном итоге останется в живых.
 Этапы «уничтожения» солдат из круга графически представлены на рис. 2—4.
 Рассмотрим конкретную ситуацию и определим результаты, используя предопределенные условия. Задача состоит в том, чтобы установить зависимости между параметрами k, n (где n — это количество людей в круге, k — служит для определения каждого k-го солдата для «исключения» из круга), и решить задачу независимо от того, сколько солдат стоят в круге.
Попробуем вывести общие формулы для решения задачи с любыми входными параметрами (на вход подаются значения k и n). Для этого определяем функцию F(n), где F(n) — возвращает номер победителя.
Сразу возникает первое предположение, что F(n) может быть в пределах F(n) = n / 2, что верно при n = 10 или n = 2. Однако при n = 4 F(4) = 1, что доказывает неправильность рассуждений.
Следующее замечание из рассмотренной выше ситуации: полученный результат — нечётный номер, независимо от значения n, так произошло вследствие того, что в ходе 1-го этапа — были убраны все четные номера. Также следует учесть тот факт, что при n = 1 F(1) = 1.
Предположив, что на входе солдат = 2n. То, что остаётся после 1-го этапа показано на рис. 5.
 Наблюдается аналогичная ситуация и при 2n−1 солдатах на входе (рис. 6). Однако вводится поправка — уменьшение на единицу и увеличение F(n) в 2 раза.
 Из чего можно вывести формулу F(2n) = 2 F(n) − 1 (для всех n > 1).
Рассмотрим случай № 2, приняв во внимание тот факт, что на вход подаются 2n + 1 число солдат (то есть нечётное количество солдат). После проведения 1-го этапа «исключения» солдат из круга получится нечто, приведенное на рис. 7.
 Из чего можно вывести формулу F(2n +1) = 2 F(n) + 1 (для всех n > 1).
Сведём все рассмотренные ситуации и запишем все случаи в виде системы, позволяющей определить значение функции F(n) для любых значений n:
 Выведенные выше формулы могут быть применены и для решения исходной задачи Иосифа Флавия.
А именно:
F(2m + k) = 2k + 1 для любых m и k.
 Рассмотрим двоичные представлениям величин n и F(n):

  
    
      
        n
        =
        
          b
          
            m
          
        
        ⋅
        
          2
          
            m
          
        
        +
        
          b
          
            m
            −
            1
          
        
        ⋅
        
          2
          
            m
            −
            1
          
        
        +
        .
        .
        .
        +
        
          b
          
            1
          
        
        ⋅
        2
        +
        
          b
          
            0
          
        
      
    
    {\displaystyle n=b_{m}\cdot 2^{m}+b_{m-1}\cdot 2^{m-1}+...+b_{1}\cdot 2+b_{0}}
  
,
где каждое 
  
    
      
        
          b
          
            i
          
        
      
    
    {\displaystyle b_{i}}
  
 равно 0 или 1, причем старший бит 
  
    
      
        
          b
          
            m
          
        
      
    
    {\displaystyle b_{m}}
  
 равен 1. Вспоминая, что 
  
    
      
        n
        =
        
          2
          
            m
          
        
        +
        k
      
    
    {\displaystyle n=2^{m}+k}
  
, последовательно получаем:
 (так как 
  
    
      
        k
        =
        n
        −
        
          2
          
            m
          
        
        =
        
          2
          
            m
          
        
        +
        
          b
          
            m
            −
            1
          
        
        ⋅
        
          2
          
            m
            −
            1
          
        
        +
        …
        +
        
          b
          
            1
          
        
        ⋅
        2
        +
        
          b
          
            0
          
        
        −
        
          2
          
            m
          
        
        =
        0
        ⋅
        
          2
          
            m
          
        
        +
        
          b
          
            m
            −
            1
          
        
        ⋅
        
          2
          
            m
            −
            1
          
        
        +
        …
        +
        
          b
          
            1
          
        
        ⋅
        2
        +
        
          b
          
            0
          
        
      
    
    {\displaystyle k=n-2^{m}=2^{m}+b_{m-1}\cdot 2^{m-1}+\ldots +b_{1}\cdot 2+b_{0}-2^{m}=0\cdot 2^{m}+b_{m-1}\cdot 2^{m-1}+\ldots +b_{1}\cdot 2+b_{0}}
  
)
 (так как 
  
    
      
        2
        k
        =
        2
        (
        
          b
          
            m
            −
            1
          
        
        ⋅
        
          2
          
            m
            −
            1
          
        
        +
        
          b
          
            m
            −
            2
          
        
        ⋅
        
          2
          
            m
            −
            2
          
        
        +
        …
        +
        
          b
          
            1
          
        
        ⋅
        2
        +
        
          b
          
            0
          
        
        )
        =
        
          b
          
            m
            −
            1
          
        
        ⋅
        
          2
          
            m
          
        
        +
        
          b
          
            m
            −
            2
          
        
        ⋅
        
          2
          
            m
            −
            1
          
        
        +
        …
        +
        
          b
          
            1
          
        
        ⋅
        
          2
          
            2
          
        
        +
        
          b
          
            0
          
        
        ⋅
        2
        +
        0
      
    
    {\displaystyle 2k=2(b_{m-1}\cdot 2^{m-1}+b_{m-2}\cdot 2^{m-2}+\ldots +b_{1}\cdot 2+b_{0})=b_{m-1}\cdot 2^{m}+b_{m-2}\cdot 2^{m-1}+\ldots +b_{1}\cdot 2^{2}+b_{0}\cdot 2+0}
  
)
 (так как 
  
    
      
        F
        (
        n
        )
        =
        2
        k
        +
        1
      
    
    {\displaystyle F(n)=2k+1}
  
 и 
  
    
      
        
          b
          
            m
          
        
        =
        1
      
    
    {\displaystyle b_{m}=1}
  
)
Таким образом, мы получили, что
 то есть F(n) получается путём циклического сдвига двоичного представления n влево на одну позицию.