ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ARC077 D - 11

問題
提出コード

解法

ダブっている数字は数列に1つ必ず存在します。
ダブってる数字のうち左側にあるものをx,右側にあるものをyとしたとき、数列は次のようになっています。
 l, x, m, y, r
ここで、l,m,rはそれぞれ0個以上の要素を持っている数列です。
長さkの部分列を数え上げる方針としては、まず
l, x, m, r というyを除いたパターンを数え、その後yが存在した場合に新しく作成できるパターンを計算して合算します。

  • yを無視した場合
    l, x, m, r
    という数列には、1nの数字がすべて1つずつ含まれています。ので、全ての数字について、使うか使わないかの2通りを考えればよく、これは
    _nC_k
    となります。

  • yを考慮した場合
    新しく増えるパターンは、必ずyを使用します。なぜなら、使用しないパターンはすでに前の段階で数えているからです。
    ここは、さらに2つに場合分けします。xを部分列に含むか含まないか、です。


  1. xを含む場合
    x,yを使用することが確定しているので、残ったl,m,rの部分からk-2個を選びます。ということで
    _{(n-1)}C_{(k-2)}
    となります。

  2. xを含まない場合
    xyが同じ数字であるので、被りがないように数え上げなければなりません。
    ここで、どのように部分列を選んだらまだ数えられてない部分列(ここで数えるべき部分列)になるかというと、
    mの中から少なくとも1つの要素を選んだ場合
    です。
    lの要素は、xを使用した場合でもyを使用した場合でも、その数字より左側に、rはどちらの場合でも右側に存在します。
    ですが、mにある要素は、xを使用した場合はxの右側に、yを使用した場合ではyの左側に並ぶことになりますので、かならずまだ数えられてない、新しい部分列を作成できます。
    mの中から少なくとも1つの要素を選ぶことについて考えると、
    l,m,r全て使うパターン、m,rを使うパターン、l,mを使うパターン、mのみ使うパターンの4通りです。
    これをそれぞれ求めるのは難しいので、l,m,rの中から自由に選ぶパターンから、余分なパターンを引く、包除原理の考え方を使うことにします。
    l,m,rの中から自由に選ぶパターンの計算式をたてます。すでに決まっているのはyのみなので、l,m,rから残りのk-1個を選択します。l,m,rの個数をその文字で表現したとき、
    _{(l+m+r)}C_{(k-1)} となります。
    そして、余分なパターンは、mを使用しないパターンです。これは言い換えると、l,rのみから選んだパターン、となります。
    l,rから自由に選ぶパターンは、簡単に計算することができ、
    _{(l+r)}C_{(k-1)} です。あとは、上の式から下の式を引くだけでよく、
    _{(l+m+r)}C_{(k-1)} - _{(l+r)}C_{(k-1)} となります。

    ということで、最終的な式は次のようになります。
    _nC_k + _{(n-1)}C_{(k-2)} + _{(l+m+r)}C_{(k-1)} - _{(l+r)}C_{(k-1)}
    あとは、それぞれのkについてこれを求めれば、答えとなります。