問題は次のとおりです。n
タイプのアイテムがあり、そのうちのl
を選択したい(発注事項)。最後にそのアイテムを選択してからk
個の他のアイテムが選択されている場合にのみ、タイプのアイテムを再サンプリングすることができます。あなたが形成できるアイテムのシーケンスの総数を数えます。これが混乱している場合は、次の例を参照してください。交換ごとにkターン毎にカウント
と言ってくださいn = 5
,l = 6
およびk = 3
です。
答えは5 * 4 * 3 * 2 * 2 * 2
です。 最初のターンで5つのアイテムのどれかを選択できます。 2回目、3回目、4回目に再び4
、3
、および2
のいずれかのアイテムを選択できます。その後、5回目に1
を選択することができますが、最後に選択された3つのアイテムが選択されたため、5
が再度選択されます。総計は480
です。
はここでこれを解決する素朴なアルゴリズムです:
def differentPlaylists(n, k, l):
ans, choices = 1, n
while l > 0:
ans = (ans * choices) % 1000000007
choices -= 1
k, l = k - 1, l - 1
if k < 0: choices += 1
return ans
これは動作しますが、それはあまりにも遅いです。私はl
の多重演算よりもこの問題を解決するアルゴリズムをどうやって作ることができるかわかりません。
誰かが私がそれをどうやって行うことができるかを理解する助けができますか?
ありがとうございました!私は実際に累乗に必要な最適化が見られないというコンビナトリアル議論をどのように最適化できるかを理解することを本当に頑張っていました。ここでは、mを法とする指数を計算する素晴らしい記事があります:https://eli.thegreenplace.net/2009/03/28/efficient-modular-exponentiation-algorithms – user7337732