Пожалуйста, подпишитесь на официальный канал Codeforces в Telegram по ссылке https://t.me/codeforces_official. ×

Блог пользователя Bch

Автор Bch, история, 6 лет назад, По-русски

Подскажите, пожалуйста, как работает предпосчёт факториалов с помощью которого считается кол-во размещений по модулю, встретился с этим на atcoder G25 и у многих одинаковый код(как на скриншоте), не понимаю что в нём происходит.

Есть другой вариант подсчёта invfactorial — с помощью быстрого возведения в степень(https://agc025.contest.atcoder.jp/submissions/2611599), но почему invfactorial[2] = fact[2] ^ (MOD — 2) тоже вообще не ясно.

  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

»
6 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

https://agc025.contest.atcoder.jp/submissions/2607571 посылка, которая должна была быть на скриншоте, который не прикрепляется

»
6 лет назад, # |
Rev. 2   Проголосовать: нравится +19 Проголосовать: не нравится

Тот факт, что invfactorial[2] = fact[2] ^ (MOD — 2) следует из малой теоремы Ферма:

по МТФ a^(MOD — 1) = 1 => a^(MOD — 2) = a^(-1).

»
6 лет назад, # |
Rev. 3   Проголосовать: нравится +11 Проголосовать: не нравится

Там просто человек считает отдельно по модулю значения , ... .
Затем он их перемножает и получает , ... . Точно так же, как предподсчитывают обычный факториал по модулю.

Другое дело, посчитать обратное значение по модулю можно двумя способами.

  1. inv(n, m) = nφ(m) - 1 % m, что для простых m равно nm - 2 % m
  2. Если ты заранее не знаешь, что m простое или тебе лень считать φ(m), то можно использовать рекурсивную формулу
  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится +5 Проголосовать: не нравится

    Эта формула для составных m плохо работает — ничто не мешает m % n быть не взаимно простым с m, даже если n взаимно просто с m (20 % 3 = 2). Её основное преимущество в том, что она асимптотически быстрее считает обратные для первых n чисел по сравнению с n возведениями в степень (а также код короче, если возведение в степень не оказалось нужно по какой-то другой причине).

»
6 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Дай вам бог здоровья и много рейтинга!