ABC209 C問題 Not Equalを解く
ABC209 C問題の解説とふりかえりをします。
問題
長さ の整数列 が与えられます。以下の条件を全て満たす長さ の整数列 の個数を求めてください。
ただし、答えは非常に大きくなる可能性があるので、 で割った余りを出力してください。
難しいポイント
おそらく問題を理解するのが難しいのではないかと思います。
解き方
問題文を読みながら具体的な数字を考えていきます。
2つ目のサンプルは となっています。
愚直にの条件を書き出します。
なので選べる数字としてはの3個
なので選べる数字としてはの3個
なので選べる数字としてはの4個
なので選べる数字としてはの4個
ただ同じ数字を選べないという条件があるので、から1つ選んだら、
次のは、の3個から1つ少ない2個から選べます。
すでに2つの数字を選んでいるので、次のは、の4個から2個を引いた2個から選べます。
すでに3つの数字を選んでいるので次のは、の4個から3個を引いた1個から選べます。
ということで、整数列のパターンは、となります。
もう少し一般化して表現すると、1からまでで選べる個数は個だけど、それまでに個は数を選んでいるので、Nまでをかけ続けると答えが求められます。
扱う数字が大きくなるとオーバーフローするので、掛け算をするたびにの余りを求めます。
実装
解き方の方針の通りに実装します。
Cの配列は処理の前にソートしてあげないと、不正解になります。
配列のインデックスは0から始まるので、見た目は少し異なります。
N = int(input()) c_arr = list(map(int, input().split())) c_arr.sort() ans = 1 R = 10**9 + 7 for i in range(N): ans = ans * (c_arr[i] - i) % R print(ans % R)