C - Monotonically Non-Decreasing Sequences

2 secs 1024 MB
kusirakusira's icon kusirakusira

解説

この問題はつまり、「列 AA を単調非減少に並べ替える方法は何通りあるだろうか?」ということです。

AA を適当にソートすると、単調非減少となる並べ替えが一つ得られます。
このとき、値が同じ 22 要素を自由に交換しても、列 AA が単調非減少であるという条件は満たされ続けます。

したがって、AA に属する要素の値ごとに、何通りの並べ替えが許されるかを調べ、それらをすべて掛け合わせたものを答えればよいです。

また、「値が同じ 22 要素を自由に交換できる」ことは、たとえば AA が左から右へ一列に並んでいるとして「各要素を『自分より左にある要素であって、自分自身と値が等しいもの』と交換できる」とも考えられます。

したがって、既に現れた値の個数を管理しながら、列 AA を適当な順に操作することで答えを求められます。
個数の管理には連想配列などを用いてもよいですが、列 AA をあらかじめソートしておくことで楽に実装できるかもしれません。(詳しくは実装例をご参照ください。)

実装例

C++
Python

別方針

実は答えは「各要素の数の階乗の積」と等しくなります。

考え方的には前の項と同じですが、このような実装でもこの問題を正解することができます。

Python