Official

F - Wine Thief Editorial by QCFium


\(b_i : \) 左から \(i\) 番目のワインが 使われるような、高橋君に気づかれない盗み方の数
となるような数列 \(b\) を求めます。 これが求まれば、答えは \(\displaystyle \sum_{i = 1}^N A_ib_i\) です。

\(b_1 = b_2 = b_3 = \dots = b_N\) であれば簡単ですが、ワインの列に端があることが原因で \(N\) 本のワインに (左右対称より強い) 対称性があまりありません。
そのため、一度 \(N\) 本のワインが環状に並んでいる場合の問題を考えます。(すなわち、元の設定の場合に加えてワイン \(1\) とワイン \(N\) も隣接していることにします)
この場合、\(N\) 本のワインは対称であるため、全ての気づかれない盗み方の数を \(x\) とすると \(b_1 = b_2 = b_3 = \dots = b_N = \frac{xK}{N}\) となります。

\(n\) 個の環状に並んでいるワインから隣り合わないように \(k\) 個選ぶ方法の数を \(f(n, k)\) とします。
また、\(n\) 個の直線状に並んでいるワインから隣り合わないように \(k\) 個選ぶ方法の数を \(g(n, k)\) とします。
すると、\(f(n, k)\) は、ワイン \(1\) を使うか使わないかで分けて考えると \(g(n - 3, k - 1) + g(n - 1, k)\) に等しいことが分かります。
また、\(g(n, k)\)\(k\) 個の黒石と \(n - k\) 個の白石を、黒石が隣り合わないように並べる方法の数に等しいです。これは \(k\) 個の黒石と \(k - 1\) 個の白石が (黒石から始めて) 交互に並んでいる状態に、\(n - k - (k - 1)\) 個の白石を追加すると考えると重複組み合わせを用いて \(_{k + 1} \mathrm{H}_{n - k - (k - 1)}\) と表せます。

これでワインが環状に並んでいる場合は解けました。
ワインが直線状に並んでいる場合は、以下の \(2\) つに分けて処理することができます。

  • 環状に並んでいる場合でも許される選び方
    上で議論した通り、\(b_1, b_2, b_3, \dots, b_N\) 全てに \(\frac{f(N, K)K}{N}\) が足されます。

  • ワイン \(1\) とワイン \(N\) を両方選ぶ選び方(環状では許されないが直線状では許される選び方)
    \(b_1, b_N\) への寄与はそれぞれ \(g(N - 4, K - 2)\) です。
    \(b_3, b_4, b_5, \dots, b_{N - 2}\) への寄与は \(N \leftarrow N - 4, K \leftarrow K - 2\) として再帰的に処理すればよいです

前計算で \(_n\mathrm{C}_r\)\(O(1)\) で計算できるようにしておけば、\(f(n, r), g(n, r)\)\(O(1)\) で求めることがでるようになります。
再帰の回数は \(O(N)\) 回なので、\(b\) への範囲加算を imos 法などで高速に行えば \(O(N)\)\(b\) が求まり、全体の答えが求まります。

再帰の過程で現れ得る \(N = K = 1\) などのコーナーケースに注意してください。

posted:
last update: