タイトル説明
暁明は、列車が旅していた携帯電話を使用して音楽を聴くのが好き、彼は途中で電車を通じて電話でのNの曲を持って、彼は曲のPを聞くことができるので、彼はプレイリスト生成Pの曲を生産したかった、このプレイリストルールは以下のとおりです。
(1)すべての曲は、少なくとも一度は演奏しなければならない
同じ曲の2の途中で(2)、少なくとも最初のM他の曲
暁明は、あなたがして、生成することができますどのように多くの異なったプレイリストだろうN、M、Pは、あなたがカウントすると、出力は十億七の残りの部分を取ります
説明入力:
入力N、M、P
N 1 100の範囲
N 0の範囲内のM
〜100の範囲でP N
出力説明:
十億七の出力MOD余り
1 インポート数学 2 N、M、P =マップ(INT 、入力()。スプリット()) 3 DP = [ 0 ため _ 中範囲(P + 1)] のための _ 中範囲(N + 1 )] 4 用 I で範囲(M + 1、N + 1 ): 5 用 J における範囲(I、P + 1 ): 6 であれば J == IまたはI == M + 1 : 7 のDP [I] [J] = math.factorial(I) 8 他: 9 DPは、[I]は[j]は[I-DPを= 1 ] [J- 1 ] * iが+ DP [I]、[J- 1 ] *(I- M) 10プリント(DP [n]を[P]%十億七)
アルゴリズム的思考:動的計画。
タイトルが長さp、どのように多くの可能性の曲のリストを構成n個の異なる曲を使用して、計算されます。
2つの条件があります。
曲ごとに少なくとも1は、なければなりません、一度再生するp型> = n-は、この条件は簡単に、この条件が暗示され、それ以外の場合は満たさ看過できません。
図2は、同じ2つの曲の中間、少なくとも第一のスペーサM他の曲。
本主題の概念を説明するための実用的な例。N = 4、M = 2、P = 5と仮定する。
定義されたDP [N + 1] [P + 1]二次元アレイは、初期値は0です。各要素は、どのように可能性が高い私は、曲のリストを構成長jで表されます。明らかDP [n]が[P]は、所望されます。
I = 0、0は、値が0である曲、1曲の可能組成を表します。
I = 1、1が2つの場合に議論される楽曲を表します。
m = 0の場合、値は1であり; m> = 1は、値が0の場合。表題M = 2、したがって値は0です。
I = 2は、2曲が表現され、
もしM = 0、次いで2×2 = 4;もし、M = 1、次いで2 * 1 = 2、M> = 2は、値が0の場合。表題M = 2、そう0の値。
計算を開始するだけの最初の行からM + 1次に、第m行にゼロ番目の行の値が0である、上記の分析から求めることができます。コードのライン4を参照:(範囲。M 1 +、P + 1)。
I = 3、3曲が発現し、この質問にM = 2、
J = 3、3つの第1選択位置があり、第二の位置の2つのオプション、位置を選択された第二の種を有します。コード数学の最初の行を参照。7. 階乗()階乗。
曲の長さを計算するために、J = 4は、二つの部分に問題を検討するために、単一3つの4曲を生成することです:
第一部2は図3に示すように、2つの間隔の楽曲1曲の長さを生成します。左上* I
第二部は、曲の3曲は3、2つの間隔の単一長さを生成します。左*(I - M)
結果は2つの部分の総和です。
しかし、なぜこの部門は、私が理解したいと思っていません。最初のレコードだけは、多分それを理解することができます。