0Pricing
Coding Interview Prep · レッスン

前計算した階乗による nCr

素数を法として組み合わせの数を数えます

「前計算した階乗による nCr」はCoddyKit上の無料Coding Interview Prepレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCoding Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Coding Interview Prepコースには全4レッスンが含まれています。

組み合わせを数える

多くの問題では、n 個の項目から r 個を選ぶ方法の数を nCr として求めます。コンテストでは、この個数を素数を法として求めることがよくあります。🧮

階乗の公式

基本的な公式は、nCr が n の階乗を、r の階乗と n−r の階乗の積で割ったものだということです。問題は、mod の下では割り算ができないことです。

# nCr = n! / (r! * (n-r)!)

階乗は急激に大きくなる

1つの階乗だけでも非常に大きくなるため、それぞれを p で割った余りにします。これにより各値を小さく保ちながら、modulus の下では公式を正確に維持できます。

すべての階乗をあらかじめ計算する

必要な最大の n まで、fact 配列を一度だけ作成します。各要素は1つ前の要素に添字を掛け、計算のたびに p で割った余りを取ります。

fact[i] = fact[i-1] * i % MOD

割り算には逆元が必要

公式では2つの階乗で割るため、それらの法逆元が必要です。逆元を使えば、割り算を簡単な乗算に変えられることを思い出してください。

最大の階乗の逆元を求める

最大の階乗の逆元を、フェルマーの小定理を使って一度だけ求めます。指数 p−2 で pow を呼び出し、その結果を残りの計算の基準にします。

inv_fact[n] = pow(fact[n], MOD - 2, MOD)

逆階乗を後ろ向きに計算する

残りの逆階乗は、次の要素に添字を掛ける形で、後ろ向きに1回走査して求めます。追加の pow 呼び出しは必要ありません。

inv_fact[i] = inv_fact[i+1] * (i+1) % MOD

nCr を組み立てる

これで nCr は、fact[n] と inv_fact[r] と inv_fact[n−r] を掛け合わせ、すべてを p で割った余りを取るだけです。クエリごとに3回の参照と2回の乗算で済みます。

C = fact[n] * inv_fact[r] % MOD * inv_fact[n-r] % MOD

各クエリを瞬時に処理する

前計算の後は、組み合わせの各クエリを O(1) で答えられます。そのため、nCr の値を何千個も求める問題でこの方法が力を発揮します。

境界条件を処理する

r が負、または n より大きい場合、答えは 0 です。階乗配列の範囲外を参照しないよう、まずこの条件を確認してください。

if r < 0 or r > n: return 0

配列のサイズには余裕を持たせる

すべてのクエリにおける最大の n に少し余裕を加えたサイズで配列を作ります。小さすぎるlimitは、ここでよくあるインデックスエラーの原因です。

N = 200005

確認問題

前計算の後、1回の nCr クエリはどれくらいの速さで処理できますか。

まとめ

これで、階乗とその逆元を一度だけ前計算し、3回の参照によって各 nCr を O(1) で求められるようになりました。r の範囲を確認し、十分大きな配列を用意しましょう。🏆

よくある質問

「前計算した階乗による nCr」レッスンは無料ですか?

はい。「前計算した階乗による nCr」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Coding Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Coding Interview Prepコースには全4レッスンが含まれています。

「前計算した階乗による nCr」で何を学びますか?

素数を法として組み合わせの数を数えます ブラウザで直接実行するハンズオンコードでCoding Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Coding Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCoding Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「前計算した階乗による nCr」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCoding Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのCoding Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 素数を法とする計算
  2. 高速なモジュラーべき乗
  3. フェルマーの小定理による逆元
  4. 前計算した階乗による nCr
← Coding Interview Prepに戻る