競プロと切っても切れない関係にあるのが数学です。競プロ上位勢で数学全然駄目って人はほぼ皆無と言っていいんじゃないかと思います。そんな競プロガチ勢の口から時たまOMCという単語が聞こえてくるので、なんじゃそりゃと思い調べたところOnlineMathContest(OMC)なるものがあるらしく、興味を持ったのでGW中に参加してみました。
OnlineMathContest(OMC)って?
以下OMCのホームページより引用です(なぜか引用文のMarkdown記法がうまく反映されない…)。
OnlineMathContestは世界中のSolverが参加する数学コンテストサイトです. 年齢, 国籍, 性別に関係なく参加可能です. 参加者は中学生から国際数学オリンピックのメダリストまで様々です. 世界にあなたの実力を見せつけてみませんか?
OMCでは、競プロと同様定期的に開催されるコンテストに参加して数学の問題を解くことで、正答数や回答時間に応じてレート付けされます。レート帯に応じて色が変わるのもAtCoderをはじめとした競プロサイトと同じですね。
OMCのレート=数学力?
さてそんなOMCですが、レートの高さが数学力の高さを100%反映しているかというと、必ずしもそうでもないように感じています。理由は以下2つです。 ※ちなみに、数学力が高ければOMCのレートも高い、は真だと思っています。
- 解答の形式が決まっている
OMCの問題は基本的に、解答となる何らかの非負整数を求めて解答欄に半角数字で入力せよ、という形式になっています。これは大量のSolverの解答を機械的に正誤判定していくために必要な制約だと思いますが、それ故に記述式の証明問題等は出ません。また、計算過程においても小数以下何桁まで考慮する、みたいなケースは多分無いんじゃないかと思います(まだ2回しか受けてないので適当なことは言えませんが…)。
これが何を意味するかというと、問題のメタ読みが可能になるのではないかと思います。例えば幾何の問題で、解答が綺麗な整数になるというルールを念頭に置くと、「ここに補助線を引いたら綺麗に解き進められそう…」みたいなエスパー解答を未証明で導出して正解に辿り着く、ということが可能になります(やりました)。
- 外部ツールの使用が可能
OMCのトップページには、以下のような記載があります。
外部ツールとは何でしょうか。関数電卓とかいろいろあるかと思いますが、ゲームバランスを結構崩壊させるものとして、プログラムによる全探索があると思います。例えば整数問題で、『○○の条件を満たすような整数Nを全て求めその総和を回答せよ』みたいな問題が出題された時に、forループでひたすら様々な整数Nに対して○○の条件を満たすか否か判定することで、全然頭を使わずに問題が解けてしまいます(やりました)。
以上踏まえると、いろんな解き方の可能性を瞬時に思い付ける人が高レートを叩き出せるのかなと思いました。純粋に数学力で殴っていってもいいでしょうし、それを補う形で効率的な全探索プログラムを書いて答えを求めるのも一つの手です。ただ、さほど考察を必要としない問題なら良いですが、そもそも何を全探索したら良いのかが一目で分からないような問題だとやっぱり純粋な数学力が必要になるんだと思います。
(8/10追記) 外部ツールの使用に関して、公式から以下の発表がありました。純粋な数学力を競うというのが目的である以上、極めて妥当な判断だと思います!
【solverの皆さまへ、非常に重要なお知らせ】
— OnlineMathContest【公式】 (@OMathC_official) July 17, 2021
この件について永く検討を重ねてきましたが、Wolfram Cupの開催を決定打とし、我々は正式にルール改定に踏み切ります。競技の性質を大きく変える行動ですが、あくまで数学コンテストとしての本質を追い求めるための究極の判断です。どうかご理解ください。 pic.twitter.com/BrYFHnbfip
OMC026
結果は4完でした。その前に受けたOMC025 (for beginners)では1完しかできていなかったので正直全然期待していませんでしたが、予想以上の成績でした。ただズルい解き方をいっぱいしたので、実力とは言えないですね…
OMC026(A)
連立方程式で解きました。解答を提出してからイカとタコどっちの匹数を提出したか分からなくなり焦りましたが運良くノーペナで切り抜けられました。
OMC026(B)
4次方程式の解と係数の関係をググって、p,q,r,sをそれぞれ求めていきました…が…計算ミスによりなんと5WA。虚数単位が出てきた時は、これ本当に合ってるんかいなと不安になりましたが、計算すすめるとが綺麗に消えていったので安心。
後で解説見たら、めちゃくちゃ頭いい解き方でビビりました。効率良く解くことで途中の計算ミスも防ぐことができるという、OMC上位勢の強さの秘訣を垣間見た気がしました。
OMC026(C)
ズルした問題その1です。ちょっと考えたんですが方針浮かばず、とりあえずプログラム書いてforループ回してみたらn=100までで条件を満たすnが1つ見つかり、それ以降はなんとなく条件を満たすnが出てこなさそうな雰囲気だったので、未証明ながらそのまま解答を提出。CAしてしまいました。後で解説読みましたが一箇所行間を補完できないところがあり、もにょっています。
def divisor(n):
lower_divisors , upper_divisors = [], []
i = 1
while i*i <= n:
if n % i == 0:
lower_divisors.append(i)
if i != n // i:
upper_divisors.append(n//i)
i += 1
return lower_divisors + upper_divisors[::-1]
for i in range(1,10000):
equation = i**4 + 24*(i**3)
table = divisor(equation)
if len(table) == 21:
print(i)
OMC026(D)
ズルした問題その2です。それっぽい図形を書いて考えていると、なんとなくDAの間にうまく点Pをとることで△ABP、△PCD、△PBCが相似にできそうな予感がしました。なので、AP=x、PD=yと置いて、x:25=9:yと立式したところxy=225になってx=y=15と綺麗な数字が求まったので、未証明ながら3つの三角形が相似と仮定して解き進めていきました。またしても相似な三角形の辺の比を用いてBP、CPの長さを求めたら√が出てきて嫌な気持ちに。ただヘロンの公式で3つの三角形の面積をそれぞれ求めると√が消えたので正解を確信して提出。残り時間数分でCAでした。これも解説だととてもスッキリと解いていて見ていて清々しいです。
E問題以降は解けておらず、多分実力的にも解くのは相当厳しいかなぁと思っています。今回は相性のいい問題たちだったおかげで4問も解けた(と言って良いのか微妙ですが)ことに驚いています。次回で入茶できるといいなぁ…
以上です。