Try   HackMD

OMC230F 思考過程

公式解説と本質的には変わらないだろうが、数学初心者の競プロerなりに考えた方法を書き留めておく。私はこちらの方が考えやすかった。

AB0 に、C1 に置き換えた文字列を考える。たとえば、ACBAC01001 となる。定義より、0 が隣り合うことがあっても、1 が隣り合うことはない。

このようにしたとき、操作は以下のように置き換えられる。

  • 01 の間には、0 を挿入する。
  • 10 の間には、0 を挿入する。
  • 00 の間には、1 を挿入する。

以下のようなDPを考える。

  • DPs[i]=
    00
    i
    回操作を行ったときの、1 の個数
  • DPd[i]=
    01 または 10
    i
    回操作を行ったときの、1 の個数

明らかに、

DPs[0]=0,DPd[0]=1 である。

また、

1i のとき、DPの値は以下のようになる。

  • DPs[i]=2DPd[i1]1
    • 00
      1
      回操作すると 010 になるので、0110 に対して
      i1
      回操作を行うことになる。真ん中に挿入した 1 が重複して数えられることに留意。
  • DPd[i]=DPs[i1]+DPd[i1]
    • 01
      1
      回操作すると 001 になるので、 0001 に対して
      i1
      回操作を行うことになる。10 の場合でもほぼ同様。

DPの様子をある程度手計算してみることにする。

i
DPs[i]
DPd[i]
0
0
1
1
1
1
2
1
2
3
3
3
4
5
6
5
11
11
6
21
22
7
43
43

こう見ると、

i が奇数のとき
DPs[i]=DPd[i]
になりそうである。これを帰納法で証明しておこう。(なお本番中は証明していない)

  • i=1
    のとき、明らかに正しい。
  • 3i
    かつ
    i
    が奇数のとき、
    • DPs[i]=2DPd[i1]1=2DPs[i2]+2DPd[i2]1
    • DPd[i]=DPs[i1]+DPd[i1]=2DPd[i2]1+DPs[i2]+DPd[i2]
  • DPs[i2]=DPd[i2]
    より、
    DPs[i]=DPd[i]

重要なのは

DPs[2023]
DPd[2023]
である。以降、
X=DPs[2023]=DPd[2023]
とする。

基本的に 1 の数は

2022X になりそうだが、これらは両端以外の文字を重複して数えているため、その数だけ引かれることになる。

1 の個数の最大化を考えると、明らかに

2 文字目から
2022
文字目はすべて 0 にするのがよいことになる。
1
文字目と
2023
文字目はどちらでもよいので、結局以下の
4
通りになる。

  • 00000...00000
  • 10000...00000
  • 00000...00001
  • 10000...00001

これらに対応する文字列は各

2 通りである (最も左の 0AB のどちらにするかを決めると、その他も一意に定まる) から、
m=8
である。

また、

M=2022X である。

1 の個数の最小化を考えると、

2 文字目から
2022
文字目の 1 の個数を最大化すればよいことになる。この区間の長さは奇数なので、01010...01010 のみに対応する。

0 の個数は

20232=1012 であり、すべての 0 を独立に A または B に対応させることができるので、これに対応する文字列は
21012
 通りである。よって、
n=21012
である。

また、1 の個数は

20231012=1011 個なので、
N=2022X1011
である。

m,n が求まったので、あとは
X
を求めれば、
M,N
が求まり問題が解ける。

先ほどのDPテーブルの、奇数のところだけを取り出したものを考える。そして、それらを

2 進数表記してみる。(だいたい倍々に増えているので規則性がありそうと踏んでいる)

i
DPs[i]
DPs[i]
2
進数表記
1
1
1
3
3
11
5
11
1011
7
43
101011

こうしてみると、どんどん

10 が増えてきそうな気持ちになる。試しに
i=9
などを計算してみるとなおさら正しそうである。実際、これは以下のように証明できる。(なおこれも本番中は証明していない)

DPs[i]=2DPd[i1]1=2DPs[i2]+2DPd[i2]1=4DPs[i2]1

より、

2 進数表記では末尾の
1
0
にして
11
を付け加えるといえる。

こうすると、

DPs[i]=2i23+1 と表すことができる。よって、
X=2202323+1
となる。

これらの値を

503 で割った余りを求めよう。以降、
mod503
を省略する。

Fermatの小定理より、

  • X2202323+121523+1327663+110923360
  • n2101228256

これらより、答えは

2022X+8+(2022X1011)+256727920+8+726909+2561455093417