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..b9e55977 --- /dev/null +++ b/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html @@ -0,0 +1,2112 @@ + + + + + + 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 ✅ + + 完全平方 n=36(√n=6) +
+
+
+ +
+

+ 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..389d2b38 --- /dev/null +++ b/public/Mathematics/Fundamentals/HackerRank/Claude/Easy/Sherlock and Divisors/Sherlock_and_Divisors.html @@ -0,0 +1,2112 @@ + + + + + + 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 ✅ + + 完全平方 n=36(√n=6) +
+
+
+ +
+

+ 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..f1dce402 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,6 +583,7 @@

  • 📜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
  • @@ -763,6 +764,7 @@