14
競技数学解説
文献あり

OMCの技 simasima special 解説 (後編)

2912
0

はじめに

この記事は後編です。先に 前編 を読むことをオススメします。

対称性で消して周期を見つける

バイナリ列

バイナリ列a1,a2,...a100(ai{0,1})であって、総和が3の倍数になるものはいくつ存在しますか?

元が2つしかないのでグループ分けで解くのは難しそうです。別のアプローチをしてみましょう。
数列a1,a2,...an(ai{0,1})であって、総和が3の倍数になるものの総数をxn、総和が3で割って1余るものの総数をyn2余るものの総数をznとします。試しに、xn,yn,znの値を計算してみましょう。
xn,yn,znの値はxn1,yn1,zn1の値から求められます。

n01234567
xn11125112243
yn01235102143
zn00136112142

nが同じ時のxn,yn,znの差は1未満になっていそうですね。この差を詳しく見てみたいですね。
ここで、前回の内容の確認も兼ねて、次の問題を考えてみましょう。

01バイナリ列(改)

数列a0,a1,a2,...an(a0{0,1,2},ai{0,1}(0<i)))であって、総和が3の倍数になるものはいくつ存在しますか?

これは前回もやりました。この問題の場合のそれぞれの総数xn,yn,znを考えてみましょう。

n01234567
xn1248163264128
yn1248163264128
zn1248163264128

一度xn=yn=znになるとずっとxn=yn=znになります。当たり前ですね。

ここで、元の問題について前回と同様に対称性を無理やり作り出す事を考えます。
n=2の場合、x2=1,y2=2,z2=1となっていますが、これをAx2=1,Ay2=1,Az2=1Bx2=0,By2=1,Bz2=0の二つに分けます。どうなるか実際に計算してみましょう。xn,yn,znの計算と同じように前の値から計算していきます。

n234567
Axn12481632
Ayn12481632
Azn12481632
n234567
Bxn0013611
Byn1112511
Bzn0123510

この時、線形性からAxn+Bxn=xn,Ayn+Byn=yn,Azn+Bzn=znになることが分かります。
Axn=Ayn=Aznは常に成り立つので、xn,yn,zn間の差を考えるには、Bxn,Byn,Bznだけ考えれば良いです。

ここで、n=4の場合を見ると、Bx4=1,By4=1,Bz2=2となっていますが、これはさらにABx4=1,ABy4=1,ABz4=1BBx4=0,BBy4=0,BBz4=1の二つに分けられます。xn,yn,zn間の差を考えるには、BBxn,BByn,BBznだけ考えれば良いです。
まとめると、xn,yn,znの値から途中で同じ値を引いてもxn,yn,znの差には支障がないという事ですね。
これを踏まえて、xn,yn,znを求めてみましょう。

n01234567
xn(差分)11100101211
yn(差分)01211100101
zn(差分)00101211100

n=0の場合とn=6の場合で値が一致したので、この数列の周期は6である事が分かりました。
よって、n=100 の場合の差分はx100=0,y100=0,z100=1と分かります。ところで、バイナリ列全体の数を考えれば、x100+y100+z100=2100と簡単に分かります。
あとは和差算のようなことをやれば、x100の値が分かります。
x100=21000013+0=210013

答えを求めることが出来ました!

ちなみに、差分計算について負の数を用いてこのような解釈もできます。

n01234567
xn(差分)110100100100110
yn(差分)010011000011010
zn(差分)001101011101001

こう見ると、n=1の時点で既に周期6であることが見えますね!

実践しよう

 前編では漸化式の遷移に対称性を見出すだけでしたが、今回からは漸化式の値にも対称性を見つけることが出来るようになりました。これで似たような設定の問題はほとんど倒すことが出来ます。
早速見てみましょう。

バイナリ列2(OMC048-C改題)

バイナリ列a1,a2,...a39305(ai{0,1})であって、総和が4の倍数になるものはいくつ存在しますか?

これも先ほどと同じように差分を計算して考えてみましょう。

n012345678910
総和0(mod4)11110010412816241632
総和1(mod4)012322300408241616
総和2(mod4)001324344400800
総和3(mod4)00010214812888016

n=1の値とn=3の値を比べてみましょう。値がずれながら2倍になっています。n=5,7,9の場合も値がずれながら2倍になっています。このことからn=39305の時の差分の値は、219652,219652,0,0となります。
また、総和が239305であることから、答えの値はこのように求まります。
239305219652219652004+219652=239303+219651

今話題の問題 (類題:OMC167-F)

{1,2,3,...,2000}の部分集合であって要素の総和が5の倍数であるものはいくつあるか。

3Blue1Brownの動画内では多項式が使われていますが、今回は使わずに解いていきます。
今回は毎回同じ遷移をしているわけではないことに注意してください。

n0123456
総和0(mod5)111000122
総和1(mod5)011001002
総和2(mod5)001011000
総和3(mod5)001001000
総和4(mod5)000111000

周期が52倍になっているのがわかります。(ちなみに5だけではなく一般の奇素数pについていちいち遷移を考えなくても計算できるのですが、それはまた別の機会に)
n=2000 の時は2400,0,0,0,0 となり、その総和は22000なので答えの値はこのように求まります。
2200024005+2400=22000+24025

応用編

ここからはsimasima specialを応用して解けるOMCの問題を2問紹介します。どちらも最も上のクラスのコンテストで出題された超難問です。
なお、改題によって期待値の線形性を用いる部分が省かれています。

OMC160-C(500点)(改題)

正二十面体の頂点のうち、一つをRとする。点Pは最初Rにある。点Pが「辺で繋がった頂点5つの中から等確率に1つを選び移動する」という移動を12回行ったとき、点Rと点Pとの距離の期待値を求めよ。(ここでは点Pと点Rとの距離を、PからRまで辺に沿って辿るときに経由する辺の個数の最小値とする。一致する場合は0)

n回移動した後、距離が0,1,2,3になる確率を、Zn,Sn,Dn,Tnと置きます。
この時、求めるべき値はS12+2D12+3T12なので、高々4×12=48回計算すれば求まるでしょう。しかし、これでは多くの時間がかかってしまい他の問題を解く時間が無くなってしまいます。試しにZn,Sn,Dn,Tnを計算してみましょう。

n012
Zn1015
Sn0125
Dn0025
Tn000

求めたいのは期待値です。ここで、正二十面体の上下の対称性を考えると、Sn=Dn,Zn=Tnなら、その後もずっとSn=Dn,Zn=Tnとなり、期待値は32で不変になることが分かります。(下の図は例)

n012
Zn015425
Sn1452125
Dn1452125
Tn015425

なので、SnDnは打ち消して最後に考えることが出来ます。
Zn,Sn,Dn,Tnの差分は次のようになります

n01234
Zn(差分)10150125
Sn(差分)01250152250
Dn(差分)0025002250
Tn(差分)00000

周期2でどんどん15倍されていきます。簡単ですね。
n=12の時の差分の値は156,0,0,0になります。156の場合期待値は0、それ以外の1156の場合は32なので、答えは32(1156)になります。
とてもスマートに解くことが出来ました。

OMC112-F(700点)(改題)

1から6までの整数の書かれたボールが6個ずつ計36個のボールが入った箱の中から同時にランダムに6つのボールを取り出し、書かれている数の総和を7で割った値をスコアとする。同じ数が書かれたボールも区別する時取り出し方は36C6通りある。そのスコアの総和を求めよ。

今回のラスボスです。Difficulty(難易度)は赤と最大で、正解者は僅かに4人という正真正銘の超難問です。公式の解説ではFPSを用いていますが、simasima specialを使っても倒せます。

まず、36個のボールを{1,2,3,4,5,6},{1,2,3,4,5,6},...,{1,2,3,4,5,6}という風に6つの集合S1,S2,...S6に分けます。
それぞれの集合から選ばれるボールの個数をa1,a2,...,a6とします。a1,a2,...,a6を固定した時のスコアの総和を考えてみましょう。ax=0,1,2,3,4,5,6の時、集合Sxからボールを選ぶ方法は6Cax通りありますが、ボールに書かれた数の総和をそれぞれについてまとめると次のようになります。

ax0,61,52,43
0(mod7)1032
1(mod7)0123
2(mod7)0123
3(mod7)0123
4(mod7)0123
5(mod7)0123
6(mod7)0123

ここにsimasima specialを適用すると次のように綺麗になります。

axx
0(mod7)(差分)(1)x
1(mod7)(差分)0
2(mod7)(差分)0
3(mod7)(差分)0
4(mod7)(差分)0
5(mod7)(差分)0
6(mod7)(差分)0

(これは偶然では無く、任意の素数pについて成り立つ事が組合せ的な解釈に基づいて証明できますが、今回は愚直にやっても解けるので割愛します。)
a1+a2+a3+a4+a5+a6=6であることから、(1)6=1なので、差分の値は条件を満たす全ての組(a1,a2,a3,a4,a5,a6)について1,0,0,0,0,0,0になることが分かります。a1+a2+a3+a4+a5+a6=6を満たす(a1,a2,a3,a4,a5,a6)6H6=462通りあるので、全体について差分の値は462,0,0,0,0,0,0になります。
36個のボールから6つ選ぶ方法は36C6通りです。そのうち、462通りではスコア0、その他36C6462通りには、スコア0,1,2,3,4,5,6が同じ数だけ含まれています。
よって答えは次のようになります。
0+1+2+3+4+5+67×(36C6462)=5841990

おわ らない 次回予告

これでOMCにあるsimasima specialが使えそうな問題を全て倒せる、と言いたいところですが、1問だけ残っています。OMC024-Dです。この問題はまだ筆者がいい感じに倒せていません。正確に言うとOMC024-D自体は倒せているのですが、変数を増やすと使えないAd-hocなものになっているので微妙です。変数が増えた設定の問題が解け次第新たに記事を書こうと思います。また、simasima specialを一般化して行列の対角化に持って行く話もあるのですが、筆者自身の線形代数の習熟度が足りないので半年くらい寝かせようと思います。それではまた次回。

参考文献

投稿日:2023825
OptHub AI Competition

この記事を高評価した人

高評価したユーザはいません

この記事に送られたバッジ

バッジはありません。
バッチを贈って投稿者を応援しよう

バッチを贈ると投稿者に現金やAmazonのギフトカードが還元されます。

投稿者

simasima
simasima
196
32023
OMC橙(2499/5位)OMC030,034,036,038優勝/OMC015,OMC032単独writer/AtCoder橙

コメント

他の人のコメント

コメントはありません。
読み込み中...
読み込み中
  1. はじめに
  2. 対称性で消して周期を見つける
  3. 実践しよう
  4. 応用編
  5. おわ らない 次回予告
  6. 参考文献