ごり〜
こんばんは
高校数学ぐらいの内容ですが、整理していたらいくつか気づきがあったので記します
唐突ですが、「から
までの
について、
の約数の個数の総和」をどう求めるか?を考えていきたいと思います
の大きさとしては
ぐらいのを高速に求めたいです
なお、この記事で約数の個数とは、正の約数の個数を指します
出てくるグラフも を定義域としています
ご了承ください
復習
約数
整数 の約数とは、
を割り切ることのできる整数です
以下、例としてから
までの
について、
の約数を集合で表します
の約数:
の約数:
の約数:
の約数:
の約数:
の約数:
の約数:
の約数:
の約数:
の約数:
約数の個数
約数の 個数 に注目します。一般的な特徴は以下のようになります
1の場合
の
個だけです。
素数の場合
が素数の場合、約数は
と
自身のちょうど
個です。
合成数の場合
が合成数の場合、約数は
と
の他にも
個以上存在します。
特に、が平方数の場合は奇数個、そうでない場合は偶数個となります。
一般の場合
を素因数分解した結果が
(
は素数)として、
の約数の個数は
となります
これを題材にした出題も、ときどき出てくるイメージなので忘れないようにしたいですね! (今日は使いません)
(おまけ) 高度合成数
約数の個数に触れたので高度合成数というものにも軽く触れておきます。
約数の個数が多いやつは高度合成数と呼ばれて、こんな感じです
高度合成数の一覧 | アルゴ式
この辺はキラーケースになることが多いです
反比例のグラフに乗る
の約数は、反比例のグラフ
に乗ります。
を通る格子点の
座標を列挙すると(または
座標でも同じ)、
の約数に一致します。
下の図1では、の例で、格子点の
座標は
となり、
の約数と一致します。
の約数の個数は、
を通る格子点の個数に一致する
というのも、個人的には忘れがち/ 見逃しがちな言い換えな気がします
例えば、の約数は
個 ⇔
を通る格子点は
個
です
本題
「から
までの
について、
の約数の個数の総和」 を求めたいのですが、図にすると以下の図2の赤線の部分 (赤ドットの数)を数えたいです。
理由としては、以下の図3を見てほしいのですが、から
までの
について、先ほどの
のグラフを重ねていくと、
より内側の格子点をすべてもれなくカバーしていることがわかります (図では
)
から
までの
について、
の約数の個数の総和」 とは、
のグラフの内側にある格子点の個数 と問題を言い換えることができました。
Nが小さい場合
まず の場合を考えます。
この場合は、下の図4のように縦に数えるだけで良いです。
が
から
にいたるまで、
を足して行けば良いです (
は床関数、整数切り捨て)
さて、が大きい場合はどうしましょう...???
Nが大きい場合
本題の本題です。 の場合は、先ほどの方法では計算時間は間に合わず、大部分が計算できてないように思われます。
ところが、不思議なことにあとちょっとの工夫で求まるようになります。
キーワードは で分割する です!
個人的に一番わかりやすいアプローチはこれでした。
以下、図をABC230-E kyopro_friendsさんのユーザ解説 より引用しています
① = ② + ③ - ④
ということで、①が求めたいもので、②③④を求めれば良いと言っています。
そして、②と③は「斜めに折り返すと等しい」と書いてあります。
は
と
が対称な形をしており、
がちょうど
と
が等しい部分になります。
そのため、②③のようにで分割すると、漏れなく①の領域をカバーできます。
しかも、対称なので、②を求めて
倍するだけで③を足したことになります!
②の図はが小さい場合のように縦に足していき、
として、
から
までで打ち切れば良さそうですね。
最後に、ダブルカウントしている領域は④の部分だけになるので、ここは単に を引けば良いです。
これでが大きい場合についても、「
から
までの
について、
の約数の個数の総和」を求めることができました!
めでたし!