概要
ある種の数え上げの計算は、多項式・形式的べき級数に対する計算と結び付けることができます。数え上げの問題を、多項式・形式的べき級数に対する計算と読み替えて、代数的な式変形により答を得る手法が、競技プログラミングにおいても注目され始めているようです。
さまざまな問題を文字式の問題に翻訳できるようになっておけば、文字式に対して理解を深めるだけで、幅広い問題に対する解決力を同時に伸ばしてしまうことができます。また、中高数学の学習で学んだ文字式や関数の式変形に対する能力が利用できることも魅力になると思います。
ここでは、数え上げの対象を多項式・形式的べき級数の問題に対応させる練習をしていきましょう。(逆に言うと、対応させた先の「多項式・形式的べき級数の問題を解く」方法の説明は、この記事では扱いません。)
多項式への言い換えは、経験がないうちは、唐突に感じてしまうことがあると思いますが、頻出のパターンは限られており、少しの考え方を知っておくだけで多くの場面で適用できると思います。
考え方を形式的に説明することはやめて、どんどん問題例を並べていくという形で説明を進めていこうと思います。 同様の例を繰り返し見ることで、おおよその考え方はつかめると思います。
「問題」では数え上げを問うていたりしますが、多項式・形式的べき級数と対応付けるところまでを「解答」としています。実際にそれをどう計算するかについては扱いません。
では,始めましょう.
例題
【問題1】
集合 , , がある。それぞれの集合から つずつ元 を選ぶ。 になるようにする方法は何通りあるでしょうか?
【解答】
とするとき、 の の係数が答である。
以下、「 の の係数」という概念が頻発します。これを、 と表すことにしていきます。したがって、次のような表記をとっていきます。
【解答】
が答である。
この解答に至る理由を、2つの方法で説明しましょう。
分配法則に基づく説明
一般に、 というような積を計算すると、 という形の積を全て 1 度ずつ加えたものが計算結果になります。今回の場合、
- または を選ぶ
- または を選ぶ
- または または を選ぶ
- 選んだものの積を全て加える
ことで が計算できます。選んだものを とすると、 が選んだものの積になり、したがって は となるような の選び方の総数と一致します。
状態の遷移を多項式で表す
個人的には、こちらの考え方の方がよく使っている気がします。
状態ごとに何らかの値が計算されているときに、その計算結果を多項式の形で持ちます。この際、 「多項式の次数」が「考えている状態」、「係数」が状態ごとの「計算した値」(多くの場合、数え上げ)を表すように多項式を持つのが原則です。
今回の問題では、「どのような和」が「何通りの方法で作れるか」を状態・値として多項式を更新していきましょう。
- 何も選んでいない状態 →
- 集合 の要素を選ぶ →
- さらに集合 の要素を選ぶ → ???(ここが問題)
- から を選ぶ場合 → .
- から を選ぶ場合 → .
- あわせて → .
から選ぶのは、 「状態を する選択肢」と 「状態を する選択肢」です。このように、全ての状態を一斉に定数だけ変化させるような操作を、 をかけるという形で表すことができます。「そのような操作のうちいずれか 1 つを選んで、計算結果を足し合わせる」のですから、和をとればよいですね。続けていきましょう。
- 集合 まで選んだ時点で、多項式 を得ているとする。
- さらに集合 の要素を選ぶ
- から を選ぶ → .
- から を選ぶ → .
- から を選ぶ → .
- あわせて → .
つ選ぶことが、ある多項式をかける操作になっていますね。何も選んでいない状態が でしたから、 からの選択を経て、最終的に多項式 の完成です。
さて、1 つ問題を消化しただけですが、この考え方 1 つでどんどん多項式による立式ができます。加速して、一気に問題を紹介していきましょう。
【問題2】
りんごを 個、みかんを 個、ぶどうが 個売られています。合計 個買う方法は何通りあるでしょうか?
【解答】
購入したものの個数を状態として、数え上げを係数にして、多項式を考えます。りんごに関する選択肢は、「0個、1個、2個」のいずれかで、これが と対応しています。同様にみかん、ぶどうによる遷移を考えて、状態 を取り出せば、答です。
【問題3】
りんご・みかん・ぶどうが無限にたくさん売られています。 合計 個買う方法は何通りあるでしょうか?(同種の果物同士は区別しない)
【解答】
(無限に続ける)とするとき、 が答である。
りんごに対する選択肢に個数の上限がなく、「無限個項があるような多項式」(形式的べき級数)の登場です。
実際には、りんごを 個よりもたくさん買うような選択肢を考えなくてもよいので、多項式の範囲で記述することも可能です。
【解答】
とするとき、 が答である。
考察は形式的べき級数として進めても、実装時には結局 次以下のみを多項式として計算するような手順が一般的です。
問題演習
ネタバレに配慮して、解答の一部や、問題の出典を、伏字にしている場合があります。ドラッグ反転により確認してください。
「出典」を明示している場合でも、適当な要素だけを抜き出して改題していたり、数値を具体化して考えやすくしたりしている場合がほとんどです。
【問題4】
集合 が与えられている。 となるような は何通りあるか?(関連:ABC149-E、yukicoder No.723 など)
【解答】
とするとき、 が答である。
【問題5】
から までの順に番号がついた 個のマス目が一直線に並んでいる。 回の移動では、マス からマス または に移動できる。 回の移動でゴールする移動方法を数え上げよ。 (出典: 第二回全国統一プログラミング王決定戦本戦 Fの一部分をとても簡単に改題)
【解答】
が答である。
あるいは、マス目番号を「状態」と見るならば、次の方が自然かもしれません。
【解答】
が答である。
【問題6】
問題5と同じ設定で、移動回数が何回でも良い場合の移動方法を数え上げよ。
【解答】
が答である。
無限和でもいいから、とにかく文字式の問題に帰着していきます。移動回数はせいぜい 程度なので、有限和で打ち切ってもよいです。
【問題7】
円硬貨、 円硬貨 、円硬貨が無限にたくさんある。ちょうど 円を支払う方法は何通りあるか。
【解答】
, , とするとき、が答である。
合計金額を状態とします。例えば 円硬貨の枚数を定めることは、状態遷移を の中から選ぶことと対応します。
【問題8】
重さ の荷物、重さ の荷物、…、重さ の荷物が 1 つずつある。耐荷重 のかばんに詰め込む方法は何通りあるか。(詰め込む順序などは無視。1 つも選ばなくてもよい)
【解答】
が答である。
積の記号 (シグマ記号の積バージョン)を使って、次のように書いてもよいです。
【解答】
が答である。
【問題9】
かつ、 となるような整数の組 は何通りあるか。(出典:yukicoder No.287 )
【解答】
とするとき、 が答である。
【問題10】
以下の相異なる つの素数の組 であって、 が素数になるものは何通りあるか。(出典:yukicoder No.732 で の順序制約をなくしたもの)
【解答】
を 以下の素数全体の集合とする。 とするとき、 が答である。
【問題11】
を正の整数の和として表す方法を数え上げよ。ただし、和の順序の違いは区別する。
なら、 の 通りがあります。
【解答】
とするとき、 が答である。
個の和として作る方法を足し合わせています。なお、答は という簡単な式になります。 回 択を行う方法と対応付けることでも証明できますし、形式的べき級数の扱いで証明することも可能です。
【問題12】
を正の整数の和として表す方法を数え上げよ。ただし、和の順序の違いは区別しない。
なら、 の 5 通りがあります。このような数え上げ は、分割数と呼ばれています。
【解答】
各 に対して とするとき、 が答である。
和の順序を区別しないところが厄介で、前問題と同じ立式は使うことができません。ではどのように数え上げ対象を区別するのかというと、それぞれの整数の使用回数です。「1を 個、2を 個、3 を 個、…」という見方をすればこの式になります。(例えば上述の 1円硬貨・5円硬貨・10円硬貨の問題と同じ)。
【問題13】
を相異なる正の整数の和として表す方法を数え上げよ。和の順序の違いは区別しない。
【解答】
各 に対して とするとき、 が答である。
今度は のそれぞれの整数に対して、「1回使う・使わない」の2択を行っていくので、こうなります。
【問題14】
を正の整数とする。整数の列 であって、
・
・任意の に対して
が成り立つようなものを数え上げよ。(出典:yukicoder No.802を少し易しく)
【解答】
とし、 とするとき、 が答である。
の値が状態です。 まで選んだ時点では、状態 が通りずつありえて、これを で表現しています。 1つ項が進むときに、状態を する方法が1つずつあるので、ここは 倍で書けます。
あるいは、 と考えて、初手のみ任意の正の大きさの状態遷移ができると考えてもよいでしょう。
【問題15】
を正の整数とする。整数の列 であって、
・
・任意の に対して
が成り立つようなものを数え上げよ。(※問題14とほぼ同じで、 にしました)
自然な 2 通りの方法があると思います。
【解答】
【問題14】の解説と同様の をとったとき、 が答である。
最終的な状態で場合分けして足し合わせていますね。
【解答】
【問題14】の解説と同様の をとったとき、 が答である。
を補って、「最後の一歩は任意の正の大きさで状態遷移できる」と考えるとこうなります。
【問題16】
標準的なサイコロを 回投げる。出目の和が となる確率を求めよ。
【解答】
とするとき、 が答である。
「状態」ごとの「確率」を係数に持たせて多項式を作っています。状態を する方法が 個ずつあると思うとよいでしょうか。
【問題17】
はじめ、 数直線の原点に居る。 となる実数 がある。
「表が確率 、裏が確率 で出るコイン」を投げて、表なら正の方向、裏なら負の方向に 1 進む。 回コインを投げたとき、 に居る確率を求めよ。
【解答】
とするとき、 が答である。
ちょっと新種のキャラの登場です。到達地点の座標を「状態」と考えて、計算結果を多項式で持とうとすると、 といった負べきの項が登場します。このような項を含む「多項式」はLaurent 多項式 と呼ばれます。とはいえ、考察の上での注意点は少なくて、ほとんど多項式と同じように扱えます。
プログラミングで実装する場合は、負のインデックスをそのまま扱うと事故がこわいので、次のような解決策をとることがあります。
【解答】
答は であった。これは、 と等しい。よって と等しい。これで、計算対象から負べきの項が消えた。
【問題18】
(ただし は正の整数)と表すことを考える(【問題11】と同様です)。このような分割に対してその「美しさ」を により定義する。全ての分割に対する、「美しさ」の総和を計算せよ。(出典:AGC013-Eで禁止点のない場合)
【解答】
とするとき、 が答である。
これは結構難しめでしょうか。「状態」ごとの「値」を持たせて多項式を作るのですが、値として「美しさの総和」を持たせておきます。 回目の遷移で「状態」を 進めると、「値」が 倍になるため、この形になります。
あるいは、 を分配法則で展開することを考えると、 の分割ごとに「美しさ」が加算されることが直接確認できると思います。
高次元の状態遷移
高次元の状態を持たせたい場合には、多変数の多項式や形式的べき級数を用いるとよいです。なお、私の知る限り、多変数の形式的べき級数の扱いは 変数と比べて難しく、上手い構造がないと高速計算ができない場合が増えてくるように思います。考察の上では有用です。
【問題19】
・価格が3円で重さが4グラムの商品A
・価格が5円で重さが6グラムの商品B
がある。それぞれ つまで購入できる。ちょうど 円で グラムにする方法は何通り?
【解答】
, とするとき、 が答である。
「状態 ( 円、 グラム)」を「」に対応させています。これまでの考え方を踏まえると、特に難しいところはないと思います。
【問題20】
円硬貨、 円硬貨、 円硬貨が無限個ある。ちょうど 枚使ってちょうど 円を支払う方法を数え上げよ。
【解答】
, , とするとき、 が答である。
(金額 , 枚数 ) の状態を に対応させています。
【問題21】
次元座標平面上の原点を出発して、ランダムウォークする。つまり、 に居るときに、, に等確率で移動することを繰り返す。 秒間に 回移動する。 秒後に に居る確率を求めよ。(関連:ARC-012)
【解答】
とするとき、 が答である。
【問題22】
3 つの変数 があり、はじめこれらの値はすべて である。回の操作では
・変数を つ選び、 または を加える
・すべての変数に同時に を加える、または同時に を加える
のどちらかができる。 回の操作の後に、, , となる操作列を数え上げよ。(出典:KUPC 2019-K )
【解答】
とするとき、 が答である。
問題21・22は、上手い構造があって簡単に計算できます。→ 私の記事
【問題23】
次元空間内の原点を出発する。 に居るとき、非負整数の組 (ただし を除く)を選んで にワープできる。原点から までの移動方法を数え上げよ。(出典:yukicoder No.940)
【解答】
, , とおく。 とおく。
が答である。
「 を除く」というルールがなければ、 が 1 回の移動の状態遷移になります。 を除くというルールを付加したものが になります。
【問題24】
次元空間内の原点を出発して、ランダムウォークする(確率 ずつでそれっぽく移動)。 秒後に に到達するとして、 となる確率を求めよ。(出典:yukicoder No.612)
【解答】
とするとき、 が答である。
と書いたものの、実は変数が減らせます。 変数多項式から の情報を取り出しましょう。
, , とすると、 となるので、次のようになります。
【解答】
)/6 とするとき、 が答である。
実際には、そもそも「 を状態と思う」ことで、はじめから直接この形にしてしまうのが分かりやすいかもしれませんが、どちらの手順が自然に浮かぶときもあるでしょう。
一般的なテクニックとして書くのであれば:
beetさんのブログ → http://beet-aizu.hatenablog.com/entry/2019/12/29/092046