ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC209 C - Not Equal【Python解答例】

f:id:ebisuke33:20210710225838p:plain

AtCoder Beginner Contest209のC問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 209 - AtCoder



AtCoder Beginner Contest209 C - Not Equal

C - Not Equal

問題文

長さ N の整数列 C が与えられます。以下の条件を全て満たす長さ N の整数列 A の個数を求めてください。

・1≤Ai≤Ci(1≤i≤N)
・Ai ≠ Aj ( 1 ≤ i < j ≤ N )
ただし、答えは非常に大きくなる可能性があるので、(109+7) で割った余りを出力してください。

制約

・1≤N≤2×10^5
・1≤Ci≤10^9
・入力は全て整数

解答例

n = int(input())

C = list(map(int, input().split()))

C.sort()

ans = C[0]

for i in range(1,n):
    ans *= (C[i] - i)
    ans %= int(1e9 + 7)

print(ans)

解説

求める数列の個数は組み合わせになるのでソートしてから数を掛け合わせて求めました。

整数列Cをソートすることで、次のループにおいてC[i-1]よりC[i]が等しいか大きくなります。

したがって1<= Ai <= C[i]を満足する値はC[i]個ありますが、i 個の値はすでに使用されるためC[i] - i 個が組み合わせとして考えられる数になります。
この値をansに掛け合わせて行きました。

10^9 +7で割った余りは乗算のたびに求めました。
過去に同じような問題があり、この問題でも最後に1度だけ行うと答えが異なりましたので、各ループごとに行っています。
(詳しい説明ができず申し訳ないです (^_^;))

最後にansを出力することでACでした!



ABC209の関連記事はこちら
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com