2021年4月11日日曜日

ABC 198 F - Cube

サイコロが手元にあったので、回しながら考えた。まずはバーンサイドの補題を思い出す:

  • Gが集合Xに作用するとする。この時、作用に関する同値類の総数は次の数に等しい:
1|G|gG|Fg|
  • ただし、Fggのfix、つまりFg={xX | g(x)=x}

したがって、正六面体に対する回転操作で回転前と回転後が重なるものを列挙して、各回転に関するfixの大きさを求めればよい。正六面体に対する回転を分類すると以下の通り:

  • id: 恒等変換、つまり何もしない。1通り。
  • α: ある面の中心Aと向かいにある面の中心Bを結ぶ直線を軸に90°回転する。どちら向きに回転するか述べていないが、ベクトルとみなして反時計回りに回転するとすると、ABBAで別の回転になって3×2=6通りある。
  • α2: ある面の中心Aと向かいにある面の中心Bを結ぶ直線を軸に180°回転する。3通り。
  • β: ある辺の中心Aと向かいにある辺の中心Bを結ぶ直線を軸に180°回転する。辺対が6ペアあるので6通り。
  • γ: ある頂点Aと向かいにある頂点Bを結ぶ直線を軸に120°回転する。頂点対が4ペアあって、やはり回転する方向が2通りあるので4×2=8通り。

合わせて24通りあるので、fixの大きさを求めて全部足して24で割ればよいことになる。上の回転によってどの面とどの面が重なるかを調べると、以下の数え上げをすればよいことがわかる:

  • id: x1+x2+x3+x4+x5+x6=Sの正整数解の総数を求めることに等しい。
  • α: x1+x2+4x3=Sの正整数解の総数を求めることに等しい。
  • α2: x1+x2+2x3+2x4=Sの正整数解の総数を求めることに等しい。
  • β: 2x1+2x2+2x3=Sの正整数解の総数を求めることに等しい。
  • γ: 3x1+3x2=Sの正整数解の総数を求めることに等しい。

id,β,γは単純な重複組み合わせに帰着するが、α,α2がやや面倒に見える。

たとえばαに関しては1/(1z)2(1z4)zS6の係数を求めることに等しく、1/(1z)2=(i+1i)zi(負の二項定理)を利用して1+z4+z8+...と掛けたときにどうなるか考えればよい。(自分は計算をバグらせてWolframAlphaに頼った) → x3を決め打つとx1+x2=S4x3の正整数解がS4x31個だから、x=1(S4x1)を非負の範囲で計算すればいいのか。難しく考えてしまった。


見て何をすればよいかはわかったが、WolframAlphaがなければコンテスト中にはACできていなかった。結局は計算力なんだよな。

mod6で多項式になりそうなのでラグランジュ補間、というのを見てなるほどと思った。とはいえ小さいケースをちゃんと求めるのにもある程度の考察は必要か。

https://q.c.titech.ac.jp/docs/progs/polynomial_division.html
そもそも母関数が書けた時点で貼るだけになるらしい。というか、これを知らなくても漸化式に直して行列累乗はできるのでそれは考えるべきだった。