From a150815485835439ff48d1a912ebbec9c4cb6f9b Mon Sep 17 00:00:00 2001 From: myoshizumi Date: Wed, 25 Feb 2026 18:40:43 +0900 Subject: [PATCH 1/6] feat: add Sherlock and Divisors implementation and visualization --- .../Sherlock_and_Divisors.html | 2082 +++++++++++++++++ .../Sherlock_and_Divisors.ipynb | 72 + .../Sherlock_and_Divisors.html | 2082 +++++++++++++++++ public/index.html | 14 +- 4 files changed, 4244 insertions(+), 6 deletions(-) create mode 100644 Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html create mode 100644 Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.ipynb create mode 100644 public/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html diff --git a/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html b/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html new file mode 100644 index 00000000..e8f9fc73 --- /dev/null +++ b/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html @@ -0,0 +1,2082 @@ + + + + + + HackerRank: Divisors Divisible by 2 + + + + + + + + + + + + +
+ +
+

+ Python 実装 +

+
+ +
from __future__ import annotations
+import os
+
+
+def divisors(n: int) -> int:
+    """
+    n の約数のうち 2 で割り切れるものの個数を返す。
+
+    【全単射による帰着】
+        A = { d : d|n, 2|d }  ←→  B = { k : k | (n//2) }
+        写像 φ: d → d/2  は A→B の全単射。
+        よって |A| = |B| = #divisors(n // 2)
+
+    Time Complexity:  O(√n)
+    Space Complexity: O(1)
+    """
+    if n % 2 != 0:          # ① 奇数なら偶数約数はゼロ
+        return 0
+
+    m: int = n // 2         # ② 全単射により n//2 の約数カウントに帰着
+    count: int = 0
+
+    i: int = 1
+    while i * i <= m:       # ③ i=1 から √m まで走査
+        if m % i == 0:
+            count += 1 if i * i == m else 2  # 完全平方→+1, それ以外→+2
+        i += 1
+
+    return count
+
+
+if __name__ == "__main__":
+    fptr = open(os.environ["OUTPUT_PATH"], "w")
+    t: int = int(input().strip())
+    for _ in range(t):
+        fptr.write(str(divisors(int(input().strip()))) + "\n")
+    fptr.close()
+
+
+ +
+

+ 計算量分析 +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ アプローチ + + 時間 + + 空間 + + 備考 +
+ ✅ 全単射 + √走査 + + O(√n) + + O(1) + + 本実装。数学的に最適。 +
+ 全約数列挙 + フィルタ + O(√n)O(1) + 同等だが定数倍わずかに大 +
線形スキャン + O(n) + O(1) + 大 n では TLE リスク +
+
+
+ +
+

+ エッジケースと検証 +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ n + + 偶数約数 + + m=n/2 の約数 + + 期待値 + + ポイント +
+ 1 + + 0 ✅ + + 奇数の基底ケース +
+ 2 + 21 + 1 ✅ + + 最小偶数 +
+ 9 + + 0 ✅ + + 奇数(サンプル) +
+ 8 + + 2, 4, 8 + + 1, 2, 4 + + 3 ✅ + + サンプル入力 +
+ 16 + + 2,4,8,16 + + 1,2,4,8 + + 4 ✅ + 2 の冪
+ 36 + + 2,4,6,12,18,36 + + 1,2,3,6,9,18 + + 6 ✅ + + 完全平方 m=18 +
+
+
+ +
+

+ FAQ +

+
+
+

+ Q1. なぜ偶数約数の個数 = n/2 の約数の個数? +

+

+ 写像 φ: d→d/2 が全単射になるためです。d|n かつ 2|d ⟺ d/2|n/2 が成立します。 +

+
+
+

+ Q2. 完全平方のとき count+=1 とする理由は? +

+

+ i²=m のとき i=m/i なので同一の約数を 2 回数えてしまいます。加算を 1 + に留めることで重複を防ぎます。 +

+
+
+

+ Q3. n が奇数のとき偶数約数がゼロになるのはなぜ? +

+

+ d|n かつ 2|d と仮定すると 2|n が言えます。これは n + が奇数という仮定に矛盾します。 +

+
+
+

+ Q4. 非常に大きな n でも動作するか? +

+

+ Python の int は任意精度整数なので桁あふれはありません。n=10¹² でも + √(n/2)≈7×10⁵ ステップ程度です。 +

+
+
+
+ + + + + + + + + + + + diff --git a/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.ipynb b/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.ipynb new file mode 100644 index 00000000..a84b1f40 --- /dev/null +++ b/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.ipynb @@ -0,0 +1,72 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "eb103824", + "metadata": {}, + "source": [ + "## 問題分析\n", + "\n", + "「n の約数のうち、2 で割り切れるもの(偶数)の個数」を求める問題です。\n", + "\n", + "**キーポイント**: 偶数の約数 = 2 の倍数の約数 = `n/2` の約数の個数と等しい。なぜなら、`d | n` かつ `2 | d` ⟺ `d/2 | n/2` という全単射があるため。\n", + "\n", + "### アルゴリズム比較\n", + "\n", + "| アプローチ | 時間計算量 | 空間計算量 | 可読性 | 備考 |\n", + "|---|---|---|---|---|\n", + "| 全約数列挙して偶数フィルタ | O(√n) | O(1) | ★★★ | 素直な実装 |\n", + "| n/2 の約数を数える | O(√n) | O(1) | ★★★ | 数学的に等価で定数倍高速 |\n", + "\n", + "---\n", + "\n", + "## 実装\n", + "\n", + "```python\n", + "def divisors(n: int) -> int:\n", + " \"\"\"\n", + " nの約数のうち2で割り切れるものの個数を返す。\n", + "\n", + " 偶数の約数 d (d|n, 2|d) は d = 2k と書けるので、\n", + " k | (n/2) と等価。よって n//2 の約数の個数に帰着できる。\n", + " ただし n が奇数の場合、偶数の約数は存在しないので 0。\n", + "\n", + " Time Complexity: O(√n)\n", + " Space Complexity: O(1)\n", + " \"\"\"\n", + " if n % 2 != 0:\n", + " return 0\n", + "\n", + " m = n // 2\n", + " count = 0\n", + " i = 1\n", + " while i * i <= m:\n", + " if m % i == 0:\n", + " count += 2 if i * i != m else 1\n", + " i += 1\n", + " return count\n", + "```\n", + "\n", + "---\n", + "\n", + "## 動作検証\n", + "\n", + "| n | n の偶数約数 | 期待値 | 出力 |\n", + "|---|---|---|---|\n", + "| 9 | なし(奇数) | 0 | 0 ✅ |\n", + "| 8 | 2, 4, 8 | 3 | 3 ✅ |\n", + "| 12 | 2, 4, 6, 12 | 4 | 4 ✅ |\n", + "| 1 | なし | 0 | 0 ✅ |\n", + "\n", + "**根拠**: `n=8` → `m=4` → 約数: 1,2,4 → count=3 ✓" + ] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/public/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html b/public/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html new file mode 100644 index 00000000..369ce30f --- /dev/null +++ b/public/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html @@ -0,0 +1,2082 @@ + + + + + + HackerRank: Divisors Divisible by 2 + + + + + + + + + + + + +
+ +
+

+ Python 実装 +

+
+ +
from __future__ import annotations
+import os
+
+
+def divisors(n: int) -> int:
+    """
+    n の約数のうち 2 で割り切れるものの個数を返す。
+
+    【全単射による帰着】
+        A = { d : d|n, 2|d }  ←→  B = { k : k | (n//2) }
+        写像 φ: d → d/2  は A→B の全単射。
+        よって |A| = |B| = #divisors(n // 2)
+
+    Time Complexity:  O(√n)
+    Space Complexity: O(1)
+    """
+    if n % 2 != 0:          # ① 奇数なら偶数約数はゼロ
+        return 0
+
+    m: int = n // 2         # ② 全単射により n//2 の約数カウントに帰着
+    count: int = 0
+
+    i: int = 1
+    while i * i <= m:       # ③ i=1 から √m まで走査
+        if m % i == 0:
+            count += 1 if i * i == m else 2  # 完全平方→+1, それ以外→+2
+        i += 1
+
+    return count
+
+
+if __name__ == "__main__":
+    fptr = open(os.environ["OUTPUT_PATH"], "w")
+    t: int = int(input().strip())
+    for _ in range(t):
+        fptr.write(str(divisors(int(input().strip()))) + "\n")
+    fptr.close()
+
+
+ +
+

+ 計算量分析 +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ アプローチ + + 時間 + + 空間 + + 備考 +
+ ✅ 全単射 + √走査 + + O(√n) + + O(1) + + 本実装。数学的に最適。 +
+ 全約数列挙 + フィルタ + O(√n)O(1) + 同等だが定数倍わずかに大 +
線形スキャン + O(n) + O(1) + 大 n では TLE リスク +
+
+
+ +
+

+ エッジケースと検証 +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ n + + 偶数約数 + + m=n/2 の約数 + + 期待値 + + ポイント +
+ 1 + + 0 ✅ + + 奇数の基底ケース +
+ 2 + 21 + 1 ✅ + + 最小偶数 +
+ 9 + + 0 ✅ + + 奇数(サンプル) +
+ 8 + + 2, 4, 8 + + 1, 2, 4 + + 3 ✅ + + サンプル入力 +
+ 16 + + 2,4,8,16 + + 1,2,4,8 + + 4 ✅ + 2 の冪
+ 36 + + 2,4,6,12,18,36 + + 1,2,3,6,9,18 + + 6 ✅ + + 完全平方 m=18 +
+
+
+ +
+

+ FAQ +

+
+
+

+ Q1. なぜ偶数約数の個数 = n/2 の約数の個数? +

+

+ 写像 φ: d→d/2 が全単射になるためです。d|n かつ 2|d ⟺ d/2|n/2 が成立します。 +

+
+
+

+ Q2. 完全平方のとき count+=1 とする理由は? +

+

+ i²=m のとき i=m/i なので同一の約数を 2 回数えてしまいます。加算を 1 + に留めることで重複を防ぎます。 +

+
+
+

+ Q3. n が奇数のとき偶数約数がゼロになるのはなぜ? +

+

+ d|n かつ 2|d と仮定すると 2|n が言えます。これは n + が奇数という仮定に矛盾します。 +

+
+
+

+ Q4. 非常に大きな n でも動作するか? +

+

+ Python の int は任意精度整数なので桁あふれはありません。n=10¹² でも + √(n/2)≈7×10⁵ ステップ程度です。 +

+
+
+
+ + + + + + + + + + + + diff --git a/public/index.html b/public/index.html index 3ce77f82..bf021a71 100644 --- a/public/index.html +++ b/public/index.html @@ -416,7 +416,7 @@

🧪 Algorithm Study Index

-

153 interactive lessons across 6 domains

+

154 interactive lessons across 6 domains

@@ -431,13 +431,13 @@

- +
@@ -583,14 +583,15 @@

  • 📜checkIfInstanceOf - プロトタイプチェーン検証JavaScript/2618. Check if Object Instance of Class/Claude Code Sonnet 4.5/README_react.html
  • 📐Akash and Akhil — ボール逆順ゲーム O(1) 解法Mathematics/Fundamentals/HackerRank/Claude/Easy/Reverse Game/ReverseGame.html
  • 📐Best Divisor - √n約数列挙+桁和比較Mathematics/Fundamentals/HackerRank/Claude/Easy/Best Divisor/BestDivisor.html
  • +
  • 📐HackerRank: Divisors Divisible by 2Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html
  • 📐K番目順列アルゴリズム解析Mathematics/Permutation Sequence/leetcode/Claude/README.html
  • 📐LeetCode 9: Palindrome Number - 数値反転による回文判定Mathematics/Palindrome/leetcode/9. Palindrome Number/claud sonnet 4.5/README_react.html
  • 📐Moving Tiles - 重なり面積の時間逆算Mathematics/Fundamentals/HackerRank/Claude/Easy/moving-tiles-visualization.html
  • 📐Robot Unique Paths - 技術解説Mathematics/Combination Calculation/leetcode/62. Unique Paths/Claude/README.html
  • 📐Strange Grid 解説Mathematics/Fundamentals/HackerRank/Claude/Easy/Strange Grid Again/Strange_Grid_Again.html
  • 📐Valid Number Problem - 有限状態機械アルゴリズム解説Mathematics/Finite State Machine/leetcode/65. Valid Number/Claude/README.html
  • -
  • 📐pow(x, n) アルゴリズム解析Mathematics/Exponentiation by Squaring/leetcode/50. Pow(x, n)/Claude/README detailed.html
  • 📐pow(x, n) アルゴリズム解析Mathematics/Exponentiation by Squaring/leetcode/50. Pow(x, n)/Claude/README.html
  • +
  • 📐pow(x, n) アルゴリズム解析Mathematics/Exponentiation by Squaring/leetcode/50. Pow(x, n)/Claude/README detailed.html
  • 📐原始根の発見 - HackerRank問題解説Mathematics/Number Theory/HackerRank/Easy/Primitive_Problem.html
  • 📐整数を全て0にする問題 - 可視化デモMathematics/Other/atcoder/B45/README.html
  • 📐文字列掛け算アルゴリズムの詳細解析Mathematics/Multiply Strings/leetcode/43. Multiply Strings/Claude/README.html
  • @@ -763,14 +764,15 @@

    • 📐Akash and Akhil — ボール逆順ゲーム O(1) 解法Mathematics/Fundamentals/HackerRank/Claude/Easy/Reverse Game/ReverseGame.html
    • 📐Best Divisor - √n約数列挙+桁和比較Mathematics/Fundamentals/HackerRank/Claude/Easy/Best Divisor/BestDivisor.html
    • +
    • 📐HackerRank: Divisors Divisible by 2Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html
    • 📐K番目順列アルゴリズム解析Mathematics/Permutation Sequence/leetcode/Claude/README.html
    • 📐LeetCode 9: Palindrome Number - 数値反転による回文判定Mathematics/Palindrome/leetcode/9. Palindrome Number/claud sonnet 4.5/README_react.html
    • 📐Moving Tiles - 重なり面積の時間逆算Mathematics/Fundamentals/HackerRank/Claude/Easy/moving-tiles-visualization.html
    • 📐Robot Unique Paths - 技術解説Mathematics/Combination Calculation/leetcode/62. Unique Paths/Claude/README.html
    • 📐Strange Grid 解説Mathematics/Fundamentals/HackerRank/Claude/Easy/Strange Grid Again/Strange_Grid_Again.html
    • 📐Valid Number Problem - 有限状態機械アルゴリズム解説Mathematics/Finite State Machine/leetcode/65. Valid Number/Claude/README.html
    • -
    • 📐pow(x, n) アルゴリズム解析Mathematics/Exponentiation by Squaring/leetcode/50. Pow(x, n)/Claude/README detailed.html
    • 📐pow(x, n) アルゴリズム解析Mathematics/Exponentiation by Squaring/leetcode/50. Pow(x, n)/Claude/README.html
    • +
    • 📐pow(x, n) アルゴリズム解析Mathematics/Exponentiation by Squaring/leetcode/50. Pow(x, n)/Claude/README detailed.html
    • 📐原始根の発見 - HackerRank問題解説Mathematics/Number Theory/HackerRank/Easy/Primitive_Problem.html
    • 📐整数を全て0にする問題 - 可視化デモMathematics/Other/atcoder/B45/README.html
    • 📐文字列掛け算アルゴリズムの詳細解析Mathematics/Multiply Strings/leetcode/43. Multiply Strings/Claude/README.html
    • @@ -789,7 +791,7 @@

      🧪 - Generated on 2026-02-23 03:41:07 UTC + Generated on 2026-02-25 09:40:43 UTC
      - + + - 完全平方 m=18 + 完全平方 n=36(√n=6) @@ -470,15 +470,26 @@

      {err} + )}
      {presets.map((v) => (