Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで0からnまでのnCr値を効率的に求めるプログラム

はじめに

プログラミングでは、nCr(組み合わせの数)を何度も計算する必要がある場面がよくあります。実は、すでに計算した小さな値を保存しておけば、より大きな値を非常に効率的に求めることができます。

具体的には、整数 n が与えられたとき、nC0 から nCn までのすべての値をリストとして求めます。ただし、答えが大きくなりすぎる場合は、10^9 で割った余りを返します。

例えば、入力が n = 6 の場合、出力は [1, 6, 15, 20, 15, 6, 1] となります。

アルゴリズムの考え方

この問題を解く鍵となるのは、次の漸化式です。

nCr = nC(r−1) × (n − r + 1) / r

つまり、直前の値 nC(r−1) が分かれば、そこから次の値 nCr を簡単に計算できます。毎回階乗を計算する必要がないため、計算量を大幅に削減できるのがポイントです。

解法の手順

  • items を「1」のみを含むリストとして初期化します(これは nC0 に相当します)
  • r を 1 から n まで繰り返します:
    • (items の最後の要素 × (n − r + 1)) ÷ r の商を items の末尾に追加します
    • 末尾から2番目の要素(items[-2])を 10^9 で割った余りに更新します
  • items を返します

実装例

以下のコードで実際の動作を確認してみましょう。

def solve(n):
    items = [1]
    for r in range(1,n+1):
        items.append(items[-1]*(n-r+1)//r)
        items[-2] %= 10**9
    return items

n = 6
print(solve(n))

入力

6

出力

[1, 6, 15, 20, 15, 6, 1]

まとめ

この方法では、各値を直前の値から定数時間で導出できるため、全体の計算量は O(n) になります。階乗をそのまま計算する方法と比べても大幅に高速で、桁あふれ対策として剰余を取る処理も組み込まれています。競技プログラミングなどで組み合わせの数を頻繁に求める際にぜひ活用したいテクニックです。

  1. 【Python】ある数の最大の素因数を求めるプログラムの書き方

    この記事では、「与えられた整数の最大の素因数を求める」という問題に対する解決方法を、具体的なコード例とともにわかりやすく解説します。 問題文 正の整数 n が与えられたとき、その数の最大の素因数を求めます。 例えば n = 15 の場合、15 は 3 × 5 と素因数分解できるため、答えは 5 となります。 解き方のアプローチ 入力された数を、小さい約数から順番に割っていくことで素因数分解します。 割り切れるたびに、その時点での約数(素因数)を「最大値」として更新していきます。 平方根まで調べれば十分なため、計算量を抑えられます。 実装例(サンプルコード) import math def

  2. Pythonで円柱の周囲長を求めるプログラムの書き方

    この記事では、以下の問題をPythonを使って解く方法を解説します。 問題の定義 問題: 直径と高さを入力として受け取り、円柱の周囲長を求める。 ここでいう「周囲長」とは、円柱を横から見たときに現れる長方形の外周のことです。つまり、円柱の側面を展開すると長方形になり、その縦が円柱の高さ、横が円の直径(円周ではありません)に相当します。 したがって、周囲長は次の式で表せます。 周囲長 = 2 × ( 高さ h + 直径 d ) d:円柱の直径 h:円柱の高さ 実装例 それでは、実際のコードを見てみましょう。 # 円柱の周囲長を計算する関数 def perimeter(diameter, he