これでマスター数学的考察編〜AtCoderを戦うために典型問題を徹底マスターしよう！[競プロ解説]〜

# はじめに

今回は、数学的考察について初心者でも一から分かりやすく解説していきたいと思います。

実は僕自身、AtCoder歴は現時点で2ヶ月ほどで、まだまだ初心者です。ですが、初心者だからこそ分かる苦悩や引っ掛かりポイントがあると思います。

そこで、自分と同じようにAtCoder初心者でもこれを読めば「**数学的考察**」について理解できるような記事を書けたらと思います。

また、今回の記事と同じシリーズには以下のような記事もあるので、ぜひ興味があったら読んでみてください。

[これでマスターbit全探索編](https://qiita.com/oyutaka_jp/items/822cafd0f8e6f1c59999)
[これでマスター二分探索編](https://qiita.com/oyutaka_jp/items/e8f836903f87a5f3bead)

# 目次

1. [数学的考察とは](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E6%95%B0%E5%AD%A6%E7%9A%84%E8%80%83%E5%AF%9F%E3%81%A8%E3%81%AF)
2. [それぞれの数学的考察についての詳しい説明](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E6%95%B0%E5%AD%A6%E7%9A%84%E8%80%83%E5%AF%9F%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E8%A9%B3%E3%81%97%E3%81%84%E8%AA%AC%E6%98%8E)
3. [その他コラム](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E3%81%9D%E3%81%AE%E4%BB%96%E3%82%B3%E3%83%A9%E3%83%A0)
4. [練習問題](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C)
5. [AtCoderの典型問題(アルゴリズム)とは](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#atcoder%E3%81%AE%E5%85%B8%E5%9E%8B%E5%95%8F%E9%A1%8C%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%A8%E3%81%AF)(超初心者に向けて。読まなくても大丈夫です)
6. [超初心者に向けて](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E8%B6%85%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AB%E5%90%91%E3%81%91%E3%81%A6%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E4%BD%95%E3%82%92%E3%81%97%E3%81%9F%E3%82%89%E3%82%88%E3%81%84%E3%81%8B)(超初心者に向けて。読まなくても大丈夫です)
7. [おわりに](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB)
8. [参考文献](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE)

# 数学的考察とは

数学的考察とは、「二分探索」「bit全探索」「累積和」などのような具体的なアルゴリズムではありません。**数学的考察とは、競技プログラミングで出題されるような数学的感覚を必要とする問題を解く際のコツ、重要な視点をまとめた総称**のようなものと言えるでしょう。

しかし、「数学的感覚を必要とする問題」と言われると、とても抽象的で、天才しか手の付けられない代物のような気がしてなりませんね。僕もそう思います。ですが、そのような典型問題として落とし込みにくいような問題たちでさえも、これから紹介する、体系的にまとめられた幾つかのコツを用いることで解法への糸口をつかむことができます。どう手を付けたら良いか全く分からない状態よりかは、遥かに問題を解く上で有利となるでしょう。

ですが、大前提として、まず初めに全探索で処理する方法を考えてみて下さい。全探索でも十分処理時間が間に合う場合(10の7乗程度)は、問題を解くという観点から見れば、数学的考察を行う必要がないかもしれないからです。

# それぞれの数学的考察についての詳しい説明

数学的考察を行う上で有効な視点として、以下のようなことが挙げられます。

1. [パリティ（偶奇）に着目する](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E3%83%91%E3%83%AA%E3%83%86%E3%82%A3%E5%81%B6%E5%A5%87%E3%81%AB%E7%9D%80%E7%9B%AE%E3%81%99%E3%82%8B)
2. [とりあえず手を動かして法則性(規則性・周期性)を見つける](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A%E6%89%8B%E3%82%92%E5%8B%95%E3%81%8B%E3%81%97%E3%81%A6%E6%B3%95%E5%89%87%E6%80%A7%E8%A6%8F%E5%89%87%E6%80%A7%E5%91%A8%E6%9C%9F%E6%80%A7%E3%82%92%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%8B)
3. [上界を考える](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E4%B8%8A%E7%95%8C%E3%82%92%E8%80%83%E3%81%88%E3%82%8B)
4. [不変量に注目する](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E4%B8%8D%E5%A4%89%E9%87%8F%E3%81%AB%E6%B3%A8%E7%9B%AE%E3%81%99%E3%82%8B)
5. [変数が減らせるか考える](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E5%A4%89%E6%95%B0%E3%81%8C%E6%B8%9B%E3%82%89%E3%81%9B%E3%82%8B%E3%81%8B%E8%80%83%E3%81%88%E3%82%8B)
6. [剰余(mod)を考える](https://qiita.com/oyutaka_jp/items/2ee64699320a9d7612a9#%E5%89%B0%E4%BD%99mod%E3%82%92%E8%80%83%E3%81%88%E3%82%8B)

では、上で挙げたそれぞれの項目について、これから詳しく説明をしていきたいと思います。

## パリティ（偶奇）に着目する

以下の記事の説明がとても分かりやすいです。

https://qiita.com/e869120/items/1ccb2bdf16890637e767#8-3-%E3%83%91%E3%83%AA%E3%83%86%E3%82%A3%E3%82%92%E8%80%83%E3%81%88%E3%82%8B%E3%83%AC%E3%83%99%E3%83%ABstar2

https://algo-logic.info/how-to-think-cp/#toc_id_16

## とりあえず手を動かして法則性(規則性・周期性)を見つける

とりあえず手を動かしてみると、ある一定の周期性を見つけることができる場合があります。以下の記事が参考になります。

https://qiita.com/e869120/items/1ccb2bdf16890637e767#8-1-%E8%A6%8F%E5%89%87%E6%80%A7%E5%91%A8%E6%9C%9F%E6%80%A7%E3%82%92%E8%80%83%E3%81%88%E3%82%8B%E3%83%AC%E3%83%99%E3%83%ABstar2

## 上界を考える

最大値を求める問題では、「≤」のように上界を考えてみることで解ける場合があります。以下の記事が参考になります。

https://qiita.com/e869120/items/1ccb2bdf16890637e767#8-13-%E4%B8%8A%E7%95%8C%E3%82%92%E8%80%83%E3%81%88%E3%82%8B%E3%83%AC%E3%83%99%E3%83%ABstar3

## 不変量に注目する

ある操作を「K回以内行う」とか「好きなだけ行う」とか指定されている問題は、操作ごとに不変なものを考えてみると特徴を捉えられる場合があります。

https://algo-logic.info/how-to-think-cp/

## 変数が減らせるか考える

例えばA、B、Cという値が入力として与えられる場合、A、Bのみについて考えれば良かったり、CをAもしくはBによって表せたりする問題などもあります。

## 剰余(mod)を考える

あまりに着目すると、ある周期性を見つけられるような問題があります。また、modの性質を知っていれば解くことのできる問題などもあります。

ここで、E869120さんが以下の記事で紹介していたとても分かりやすい図を掲載させていただきたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255233/d108956b-67e3-8608-2229-a2ec20d7a82b.png)

https://qiita.com/e869120/items/1ccb2bdf16890637e767

# その他コラム

正直に言うと、数学的考察についてまとめることはかなり難易度が高いと私は思います。まず初めに、どのような項目に絞って紹介すべきかが悩みどころとなります。あまりに多くの数学的考察を紹介したところで、それら全部について理解し、それらを使いこなすにはとても労力が必要となります。あまりに多くのことについて紹介してしまったことで、結局頭の中が混乱し、どれも使いこなせなかった、と言うことにはしたくありません。そこで私は、ある程度は切り捨てて、より重要と思われる6つに絞って紹介してみました。今回紹介した記事の中には、他にもたくさんの項目について紹介し、とても分かりやすく解説している記事があります。そういった他の記事も読むことで、学びを深めていくことはとても面白いことだと思います。

# 練習問題

## パリティ（偶奇）に着目する

https://atcoder.jp/contests/agc020/tasks/agc020_a

https://atcoder.jp/contests/abc124/tasks/abc124_c

https://atcoder.jp/contests/abc086/tasks/arc089_a

## とりあえず手を動かして法則性(規則性・周期性)を見つける

https://atcoder.jp/contests/agc024/tasks/agc024_a

## 上界を考える

https://atcoder.jp/contests/abc139/tasks/abc139_d

## 不変量に注目する

https://atcoder.jp/contests/abc093/tasks/arc094_a

## 変数が減らせるか考える

https://atcoder.jp/contests/arc107/tasks/arc107_b

## 剰余(mod)を考える

https://atcoder.jp/contests/abc103/tasks/abc103_c



他にも、「アルゴリズムと数学　演習問題集」と言う問題集があり、多くの問題が紹介されているので、興味があったらぜひ解いてみてください。

https://atcoder.jp/contests/math-and-algorithm?lang=ja

# AtCoderの典型問題(アルゴリズム)とは
今回の記事でなぜ「数学的考察」を取り上げたのかについて説明したいと思います。

理由はズバリ、

**AtCoderでレーティングを上げたい！C問題まで解けるようになりたい！**と思っている方は、AtCoderで**典型問題**と言われているような以下のような解き方を**マスターすることが重要**だと思っているからです。

では、なぜそれが重要なのか？それは、以下に記した典型問題(アルゴリズム)が、大学受験における、「複素数平面」「2次曲線」「極限」「微分法」「積分法」のようなものだからです。


これらを使った解き方の基本をマスターすれば、それなりに点数が取れる、といったある種のボーダーラインとなります。

◎全探索
・[二分探索](https://qiita.com/oyutaka_jp/items/e8f836903f87a5f3bead)
・[bit全探索](https://qiita.com/oyutaka_jp/items/822cafd0f8e6f1c59999)
◎バケット・連想配列
◎区間分割・連長圧縮
◎グラフ
◎累積和
・数学的考察(幾つか考えるコツがある。偶奇についてなど)

上の中で、◎がついた項目は、(通称)[鹿本](https://amzn.to/3xAIn0e)にかなり優しく丁寧に解説されている典型問題(アルゴリズム)です。これらの典型問題(アルゴリズム)は、ぜひ[鹿本](https://amzn.to/3xAIn0e)を買ってマスターしてください！([けんちょん](https://twitter.com/drken1215)さんという方が書かれた良書です。C++、Pythonでの実装例が書かれています。)

他にもたくさんありますが、初心者の方はひとまず初心者から脱却するために、上のような典型問題(アルゴリズム)をマスターすれば良いかと思います。ここまで出来れば、あなたも茶コーダーの仲間入りを無事果たすことができると思います。

# 超初心者に向けて(これから何をしたらよいか)
AtCoder初心者で、何をしたら良いのか分からない方には、以下の本をお薦めします。

こちらは、AtCoderの典型問題についてかなり優しく丁寧に解説されています。また、それぞれの典型問題(アルゴリズム)ごとに例題、練習問題が豊富に紹介されています。かなり鍛えられる良書です。
<a href="https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E7%9A%84%E6%80%9D%E8%80%83%E5%8A%9B%E3%81%8C%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F-%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88AtCoder%E5%85%A5%E9%96%80-%E5%A4%A7%E6%A7%BB-%E5%85%BC%E8%B3%87/dp/404604408X?_encoding=UTF8&qid=&sr=&linkCode=li2&tag=0223kazu2308-22&linkId=03931e346d4d266f50c48fc4e82910f8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=404604408X&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=0223kazu2308-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=0223kazu2308-22&language=ja_JP&l=li2&o=9&a=404604408X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

こちらは、私が初めて手に取ったAtCoder本です。後半の方はかなり難易度が高く、一つ目の本を解くことに注力しました。ただ、AtCoderで必要な入出力方法についてはこちらの本で学びました。
<a href="https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%AE%9F%E6%8A%80%E6%A4%9C%E5%AE%9A-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC-%E4%B8%AD%E7%B4%9A%E7%B7%A8-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/483997277X?_encoding=UTF8&qid=&sr=&linkCode=li2&tag=0223kazu2308-22&linkId=efa11d163ec694791bf1cd57da81bba9&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=483997277X&Format=_SL160_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=0223kazu2308-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=0223kazu2308-22&language=ja_JP&l=li2&o=9&a=483997277X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />



# おわりに
ここまで読んで下さって本当にありがとうございました。

さて、どうでしたか。「数学的考察」をマスターすることはできましたか？

もしここが分からない、ここをこうしたらもっと分かりやすい記事になるんじゃない？と思った方、その他何でもコメントを下さると嬉しいです。より良い記事を書くための参考、モチベーションにしたいです。

ですので、今回分かりづらいと感じた箇所があればコメント等を参考に改善、修正をしながら執筆したいと思います。これからもよろしくお願いします。


# 参考文献
(スペシャルサンクス)

https://qiita.com/e869120/items/1ccb2bdf16890637e767

https://algo-logic.info/how-to-think-cp/

(その他)

https://atcoder.jp/contests/math-and-algorithm?lang=ja