[
  {
    "title": "Deep Research",
    "content": "2025 環球頂級科技企業（Google, Amazon, Nvidia）軟體工程師招聘生態全景與錄取預測深度報告 https://gemini.google.com/share/40d756d91283\nGraves\u0026rsquo; Disease 全方位深度研究報告：從免疫病理機制到臨床治療與全人生活型態管理 https://gemini.google.com/share/dad8691bd2ad\n2025-2030 全球勞動力與招募轉型報告：人工智慧對產業結構、就業衝擊與人力資本策略之深度研究 https://gemini.google.com/share/b80e9b470624\n",
    "permalink": "/posts/tech-interview/",
    "summary": "\u003cp\u003e2025 環球頂級科技企業（Google, Amazon, Nvidia）軟體工程師招聘生態全景與錄取預測深度報告\n\u003ca href=\"https://gemini.google.com/share/40d756d91283\"\u003ehttps://gemini.google.com/share/40d756d91283\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGraves\u0026rsquo; Disease 全方位深度研究報告：從免疫病理機制到臨床治療與全人生活型態管理\n\u003ca href=\"https://gemini.google.com/share/dad8691bd2ad\"\u003ehttps://gemini.google.com/share/dad8691bd2ad\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e2025-2030 全球勞動力與招募轉型報告：人工智慧對產業結構、就業衝擊與人力資本策略之深度研究\n\u003ca href=\"https://gemini.google.com/share/b80e9b470624\"\u003ehttps://gemini.google.com/share/b80e9b470624\u003c/a\u003e\u003c/p\u003e"
  },
  {
    "title": "Shortest Problem",
    "content": "1. Dijkstra 演算法 (Dijkstra\u0026rsquo;s Algorithm) 核心概念： 貪婪策略 (Greedy) + 優先佇列 (Priority Queue)。 適用場景： 非負權重圖的單源最短路徑 (Single-Source Shortest Path, SSSP)。 核心邏輯： 每次從「未訪問集合」中選取距離起點最近的節點，對其鄰居進行鬆弛 (Relaxation)。\n時間複雜度： $O(E \\log V)$ (使用 Min-Heap) 空間複雜度： $O(V + E)$ 2. Bellman-Ford 演算法 核心概念： 動態規劃 / 暴力鬆弛。 適用場景： 含負權邊的單源最短路徑，可檢測負權環 (Negative Cycle)。 核心邏輯： 對所有邊進行 $V-1$ 次鬆弛操作。若第 $V$ 次仍能鬆弛，則存在負環。\n時間複雜度： $O(VE)$ 空間複雜度： $O(V + E)$ 3. SPFA 演算法 (Shortest Path Faster Algorithm) 核心概念： Bellman-Ford 的佇列優化版本。 適用場景： 含負權邊但無負環的圖，且圖非稠密網格圖 (Grid Graph)。 核心邏輯： 只有當節點 $u$ 被鬆弛變小後，其鄰居才有可能變小。僅將被更新過且不在佇列中的節點加入佇列。\n時間複雜度： 平均 $O(kE)$ ($k$ 為常數，通常很小)，但在特製測資(稠密圖/網格圖)下會退化至 $O(VE)$。 注意： 現代競賽中容易被卡 (Time Limit Exceeded)，非必要請優先使用 Dijkstra。 4. Floyd-Warshall 演算法 核心概念： 動態規劃 (Dynamic Programming)。 適用場景： 全對最短路徑 (All-Pairs Shortest Path, APSP)，節點數少 ($V \\le 500$)。 核心邏輯： $dp[k][i][j]$ 表示從 $i$ 到 $j$ 只經過前 $k$ 個節點的最短路徑。 狀態轉移方程：$dist[i][j] = \\min(dist[i][j], dist[i][k] + dist[k][j])$。\n時間複雜度： $O(V^3)$ 空間複雜度： $O(V^2)$ 總結比較表 (Comparison) 算法 類型 邊權限制 時間複雜度 適用情境 Dijkstra SSSP 非負 $O(E \\log V)$ 一般最短路首選，地圖導航。 Bellman-Ford SSSP 可負 $O(VE)$ 需檢測負環或邊數極少時。 SPFA SSSP 可負 Avg $O(kE)$, Max $O(VE)$ 隨機圖快，但在競賽中易被卡。 Floyd-Warshall APSP 可負 $O(V^3)$ 點數少 ($N \\le 500$) 的全對最短路。 import heapq from copy import deepcopy def dijkstra(graph: dict[int, list[tuple[int, int]]], start: int) -\u0026gt; dict[int, int]: dist = {i: float(\u0026#39;inf\u0026#39;) for i in graph} dist[start] = 0 pq = [(0, start)] while pq: d, u = heapq.heappop(pq) if d \u0026gt; dist[u]: continue for v, w in graph[u]: if dist[u] + w \u0026lt; dist[v]: dist[v] = dist[u] + w heapq.heappush(pq, (dist[v], v)) return dist def bellman_ford(graph: dict[int, list[tuple[int, int]]], start: int) -\u0026gt; dict[int, int]: dist = {i: float(\u0026#39;inf\u0026#39;) for i in graph} dist[start] = 0 for _ in range(len(graph) - 1): for u in graph: for v, w in graph[u]: if dist[u] + w \u0026lt; dist[v]: dist[v] = dist[u] + w return dist def spfa(graph: dict[int, list[tuple[int, int]]], start: int) -\u0026gt; dict[int, int]: dist = {i: float(\u0026#39;inf\u0026#39;) for i in graph} dist[start] = 0 pq = [start] while pq: u = pq.pop(0) for v, w in graph[u]: if dist[u] + w \u0026lt; dist[v]: dist[v] = dist[u] + w pq.append(v) return dist def floyd_warshall(graph: list[list[int]]) -\u0026gt; list[list[int]]: dist = deepcopy(graph) for k in range(len(graph)): for i in range(len(graph)): for j in range(len(graph)): dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]) return dist ",
    "permalink": "/posts/shortest/",
    "summary": "\u003ch2 id=\"1-dijkstra-演算法-dijkstras-algorithm\"\u003e1. Dijkstra 演算法 (Dijkstra\u0026rsquo;s Algorithm)\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e核心概念：\u003c/strong\u003e 貪婪策略 (Greedy) + 優先佇列 (Priority Queue)。\n\u003cstrong\u003e適用場景：\u003c/strong\u003e \u003cstrong\u003e非負權重\u003c/strong\u003e圖的單源最短路徑 (Single-Source Shortest Path, SSSP)。\n\u003cstrong\u003e核心邏輯：\u003c/strong\u003e 每次從「未訪問集合」中選取距離起點最近的節點，對其鄰居進行鬆弛 (Relaxation)。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e時間複雜度：\u003c/strong\u003e $O(E \\log V)$ (使用 Min-Heap)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e空間複雜度：\u003c/strong\u003e $O(V + E)$\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"2-bellman-ford-演算法\"\u003e2. Bellman-Ford 演算法\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e核心概念：\u003c/strong\u003e 動態規劃 / 暴力鬆弛。\n\u003cstrong\u003e適用場景：\u003c/strong\u003e 含\u003cstrong\u003e負權邊\u003c/strong\u003e的單源最短路徑，可檢測\u003cstrong\u003e負權環 (Negative Cycle)\u003c/strong\u003e。\n\u003cstrong\u003e核心邏輯：\u003c/strong\u003e 對所有邊進行 $V-1$ 次鬆弛操作。若第 $V$ 次仍能鬆弛，則存在負環。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e時間複雜度：\u003c/strong\u003e $O(VE)$\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e空間複雜度：\u003c/strong\u003e $O(V + E)$\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"3-spfa-演算法-shortest-path-faster-algorithm\"\u003e3. SPFA 演算法 (Shortest Path Faster Algorithm)\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e核心概念：\u003c/strong\u003e Bellman-Ford 的佇列優化版本。\n\u003cstrong\u003e適用場景：\u003c/strong\u003e 含負權邊但\u003cstrong\u003e無負環\u003c/strong\u003e的圖，且圖非稠密網格圖 (Grid Graph)。\n\u003cstrong\u003e核心邏輯：\u003c/strong\u003e 只有當節點 $u$ 被鬆弛變小後，其鄰居才有可能變小。僅將被更新過且不在佇列中的節點加入佇列。\u003c/p\u003e"
  },
  {
    "title": "Prompts",
    "content": "要在 NotebookLM 中生成「高資訊密度、專家導向」的簡報內容，你需要極端地設定「角色」與「受眾」，並明確禁止簡化。NotebookLM 預設傾向於將內容「科普化」，你必須反向操作。\n以下是針對你需求的提示詞架構與範例：\n核心策略：反向提示 (Inverse Prompting) 不要告訴它「要做什麼」，要強調「不准做什麼」（不准解釋術語、不准寫背景介紹、不准迎合大眾）。\n推薦 Prompt 模板 (可直接複製微調) 請將以下這段文字貼入 NotebookLM 的對話框：\n指令：生成一份針對「領域內資深專家/首席工程師」的技術簡報大綱。\n1. 角色設定： 你是一位在這個領域鑽研 20 年的頂尖研究員，正在向同級別的專家進行閉門會議。\n2. 嚴格規範（必須遵守）：\n禁止科普： 預設聽眾已精通所有基礎知識與專有名詞，絕對不要解釋定義（Definitions）。 極高資訊密度： 刪除所有過場話、形容詞與情緒鋪陳。每一點都必須是具體的數據、獨到的洞察或反直覺的結論。 聚焦深層邏輯： 不要只講「是什麼」，要講「為什麼是這樣設計」、「取捨（Trade-off）是什麼」、「邊緣案例（Edge cases）有哪些」。 保留技術黑話： 直接使用原文或源文檔中最晦澀的專業術語，不要試圖轉譯成通俗語言。 風格： 冷靜、客觀、極度精簡。如果內容 90% 的人看懂了，那就是失敗的生成。 3. 輸出重點： 請根據來源文檔，挖掘出最核心、最違反直覺、或最具爭議性的技術細節。忽略所有通識性的概論。\n為什麼這樣寫有效？ 設定「閉門會議」場景： 讓 AI 認為這是內部高層對話，而非公開演講，它會自動切換成「行話模式」。 明確「預設聽眾已知」： 這是避免 AI 浪費篇幅解釋 \u0026ldquo;What is X\u0026rdquo; 的關鍵。 強調「Trade-off」與「Edge cases」： 這是區分「大眾科普」與「專業內容」的分水嶺。大眾看大方向，專家看邊界條件與代價。 負面約束 (Negative Constraint)： 明確指出「如果大眾看懂就是失敗」，這是強烈的訊號，迫使模型保留複雜度。 下一步 您可以提供您目前要分析的文件類型（例如：學術論文、財報、系統架構圖），我能為您客製化更精準的「關鍵字」來替換模板中的通用詞彙。\n",
    "permalink": "/posts/prompts/",
    "summary": "\u003cp\u003e要在 NotebookLM 中生成「高資訊密度、專家導向」的簡報內容，你需要\u003cstrong\u003e極端地設定「角色」與「受眾」\u003c/strong\u003e，並明確\u003cstrong\u003e禁止簡化\u003c/strong\u003e。NotebookLM 預設傾向於將內容「科普化」，你必須反向操作。\u003c/p\u003e\n\u003cp\u003e以下是針對你需求的提示詞架構與範例：\u003c/p\u003e\n\u003ch3 id=\"核心策略反向提示-inverse-prompting\"\u003e核心策略：反向提示 (Inverse Prompting)\u003c/h3\u003e\n\u003cp\u003e不要告訴它「要做什麼」，要強調「\u003cstrong\u003e不准做什麼\u003c/strong\u003e」（不准解釋術語、不准寫背景介紹、不准迎合大眾）。\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"推薦-prompt-模板-可直接複製微調\"\u003e推薦 Prompt 模板 (可直接複製微調)\u003c/h3\u003e\n\u003cp\u003e請將以下這段文字貼入 NotebookLM 的對話框：\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003e指令：生成一份針對「領域內資深專家/首席工程師」的技術簡報大綱。\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. 角色設定：\u003c/strong\u003e\n你是一位在這個領域鑽研 20 年的頂尖研究員，正在向同級別的專家進行閉門會議。\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. 嚴格規範（必須遵守）：\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e禁止科普：\u003c/strong\u003e 預設聽眾已精通所有基礎知識與專有名詞，\u003cstrong\u003e絕對不要\u003c/strong\u003e解釋定義（Definitions）。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e極高資訊密度：\u003c/strong\u003e 刪除所有過場話、形容詞與情緒鋪陳。每一點都必須是具體的數據、獨到的洞察或反直覺的結論。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e聚焦深層邏輯：\u003c/strong\u003e 不要只講「是什麼」，要講「為什麼是這樣設計」、「取捨（Trade-off）是什麼」、「邊緣案例（Edge cases）有哪些」。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e保留技術黑話：\u003c/strong\u003e 直接使用原文或源文檔中最晦澀的專業術語，不要試圖轉譯成通俗語言。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e風格：\u003c/strong\u003e 冷靜、客觀、極度精簡。如果內容 90% 的人看懂了，那就是失敗的生成。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e3. 輸出重點：\u003c/strong\u003e\n請根據來源文檔，挖掘出最核心、最違反直覺、或最具爭議性的技術細節。忽略所有通識性的概論。\u003c/p\u003e\u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch3 id=\"為什麼這樣寫有效\"\u003e為什麼這樣寫有效？\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e設定「閉門會議」場景：\u003c/strong\u003e 讓 AI 認為這是內部高層對話，而非公開演講，它會自動切換成「行話模式」。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e明確「預設聽眾已知」：\u003c/strong\u003e 這是避免 AI 浪費篇幅解釋 \u0026ldquo;What is X\u0026rdquo; 的關鍵。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e強調「Trade-off」與「Edge cases」：\u003c/strong\u003e 這是區分「大眾科普」與「專業內容」的分水嶺。大眾看大方向，專家看邊界條件與代價。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e負面約束 (Negative Constraint)：\u003c/strong\u003e 明確指出「如果大眾看懂就是失敗」，這是強烈的訊號，迫使模型保留複雜度。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"下一步\"\u003e下一步\u003c/h3\u003e\n\u003cp\u003e您可以提供您目前要分析的文件類型（例如：學術論文、財報、系統架構圖），我能為您客製化更精準的「關鍵字」來替換模板中的通用詞彙。\u003c/p\u003e"
  },
  {
    "title": "Interview",
    "content": "這是一篇從 FAANG（現多指 MANGA：Meta, Amazon, Netflix, Google, Apple）資深面試官視角出發，針對 Entry Level (L3/E3) 軟體工程師的面試評分指南。\n我們在評估初階工程師時，並非期待全知全能，而是尋找**「可塑性高、基礎扎實、溝通順暢」**的合作夥伴。\n面試官評分四大維度 (The 4 Pillars) 1. Data Structures \u0026amp; Algorithms (DSA) 這是核心門檻，評估候選人是否具備將抽象問題轉化為邏輯解法的能力。\nPoor (不及格): 無法理解題目或將問題建模。 只能提出暴力解 (Brute Force)，完全不考慮複雜度。 對基本資料結構（如 Map, Set, Stack）使用時機錯誤。 Borderline (邊緣): 能夠給出最佳解 (Optimal Solution)，但在分析時間/空間複雜度時猶豫或出錯。 需要面試官給予大量提示 (Heavy hinting) 才能得出正確演算法。 Solid (合格): 能獨立提出最佳解，例如將 $O(N^2)$ 優化至 $O(N \\log N)$ 或 $O(N)$。 準確分析複雜度，並能解釋 Trade-off（例如：以空間換取時間）。 Outstanding (優秀): 除了最佳解，還能探討不同解法的優劣。 能迅速處理 Follow-up 問題（例如：資料量過大無法放入記憶體時怎麼辦）。 展現出對底層原理的深刻理解（例如：Hash Collision 的處理機制）。 2. Coding (程式實作能力) 有了演算法，候選人能否將想法轉換為「乾淨、可執行、無 Bug」的程式碼。\nPoor: 語法錯誤頻發，連標準庫都不熟悉。 邏輯混亂，變數命名無意義（如 a, temp1）。 無法處理指標或遞迴邏輯，導致 Crash 或無窮迴圈。 Borderline: 程式碼可執行，但風格髒亂（Spaghetti Code），缺乏模組化。 有明顯的 Off-by-one error 或邊界條件處理遺漏。 Python 寫得像 C，沒有善用語言特性（Unidiomatic）。 Solid: 程式碼結構清晰，命名規範（Google Style Guide），縮排正確。 實作速度快，能將複雜邏輯拆解為 Helper Functions。 熟練使用標準庫（如 C++ STL 或 Python collections）。 Outstanding: Production Ready Code：考慮到擴展性、異常處理 (Error Handling)。 程式碼極其精簡優雅，閱讀起來像讀文章。 一次寫對 (One-shot pass)，幾乎不需要修改語法錯誤。 3. Efficacy / Verification (解決問題效能與驗證) 這點常被候選人忽略。這不只是「解出來」，而是「如何確保解法正確」以及「解決問題的節奏」。\nPoor: 寫完程式碼就認為結束，完全不檢查。 依靠面試官肉眼 Debug。 卡在簡單的 Bug 上很久無法脫困。 Borderline: 只測試「快樂路徑」(Happy Path)，忽略 null、空陣列或負數等邊界情況。 Dry run (人腦模擬執行) 過程混亂，無法追蹤變數變化。 Solid: 主動列出 Test Cases，包含 Edge Cases。 能夠有條理地 Dry run，並在面試官指出錯誤前自己發現 Bug。 Debug 過程有邏輯，而非隨意猜測修改。 Outstanding: 思考極其周全，在寫 Code 之前就已經考慮到潛在的坑並避開。 測試案例具備高覆蓋率。 解決問題的速度極快，留有充裕時間討論優化。 4. Communication (溝通能力) Entry Level 不需要是談判專家，但必須能「聽懂需求」並「表達想法」。\nPoor: Silent Coding：整場悶頭寫 Code，不與面試官交流。 對面試官的提示採取防禦性態度或無視。 沒弄清楚題目假設就開始寫，結果全盤重來。 Borderline: 話太多但抓不到重點，或是過於被動，問一句答一句。 解釋思路時邏輯跳躍，面試官聽不懂。 Solid: Clarify first：動手前先確認輸入輸出格式、限制條件。 Think Aloud：邊寫邊解釋當下的思路和意圖。 態度積極，將面試視為與同事的 Pair Programming。 Outstanding: 能夠引導對話，主動確認 Trade-off。 能將複雜的演算法用簡單的圖示或語言解釋清楚。 展現出 Coachability (受教性)，能迅速吸收提示並修正方向。 最終決策矩陣 (Hiring Decision) 面試結束後，面試官會根據上述四個維度綜合給出一個最終信號。\n評級 全稱 判斷標準 (校準會議視角) SNH Strong No Hire 絕對不錄用。DSA 完全不會，或溝通有嚴重紅旗 (Arrogant/Rude)。 NH No Hire 能力不足。主要維度 (DSA/Coding) 落在 Poor，無法獨立完成工作。 LNH Lean No Hire 猶豫不決，傾向拒絕。可能有 3 個 Solid 但 1 個 Borderline (通常是 Coding 有 Bug 解不掉)。除非其他面試官都是 SH，否則通常會被刷掉。 LH Lean Hire 及格邊緣，傾向錄用。所有維度皆 Solid，但沒有亮點。如果是缺人的組可能會收，但在 HC (Headcount) 緊縮時會被刷掉。 H Hire 錄用標準。四個維度皆 Solid，且至少有一項接近 Outstanding。這是一位你可以放心將 Task 交給他的合格工程師。 SH Strong Hire 強烈推薦錄用。DSA/Coding 完美，且展現出超乎 Entry Level 的系統思維或溝通能力。這類人通常會爭取加薪或 Compete Offer。 總結 對於 Entry Level 而言：\nCoding 是死線：Code 寫不出來或寫太爛，直接 NH/SNH。 DSA 是上限：決定你能否拿到 SH 或 H。 Communication 是保險：當你卡住時，良好的溝通能讓 LNH 變成 LH。 這是一篇針對 FAANG 等頂尖科技公司 Behavioral Interview (行為面試) 與 Culture Fit 的評分指南。這類面試的核心邏輯是**「過去的行為是預測未來表現的最佳指標」**。\n對於 Entry Level，面試官不期望你領導大團隊，但看重主動性 (Ownership)、受教性 (Coachability) 以及是否難搞 (No Assholes Rule)。\n面試官評分四大維度 (The 4 Pillars) 1. Impact \u0026amp; Ownership (影響力與當責) 評估候選人是「被動接受指令」還是「主動解決問題」。是否能清楚區分「團隊的功勞」與「個人的貢獻」。\nPoor (不及格): 過度使用 \u0026ldquo;We\u0026rdquo; (我們)，無法說出 \u0026ldquo;I\u0026rdquo; (我) 具體做了什麼。 像個旁觀者，將成功歸因於運氣，失敗歸因於外在環境（如：老闆很爛、隊友太雷）。 任務只做一半，遇到阻礙就停下來等指令。 Borderline (邊緣): 有做事，但缺乏數據支持結果 (Result)。 故事平淡，僅僅是「完成分內工作」，沒有展現出為了目標多做一點的熱情。 Solid (合格): STAR 原則明確：清楚描述情境 (Situation)、任務 (Task)、行動 (Action) 與結果 (Result)。 能具體量化成果（例如：提升了 10% 效能、減少 20% 手動操作時間）。 展現出對負責模組的主人翁意識。 Outstanding (優秀): Beyond the Call of Duty：不只解決當下問題，還預防了未來可能發生的問題。 即使是 Junior，也能從商業或用戶角度思考技術決策的價值。 2. Collaboration \u0026amp; Conflict Resolution (協作與衝突解決) 評估 EQ 與團隊合作能力。重點在於**「如何處理不同意見」**。\nPoor: Red Flag (紅旗)：批評前同事或主管，展現出傲慢或受害者心態。 認為衝突的解決方式就是「證明我是對的，他是錯的」。 偏好單打獨鬥，拒絕溝通。 Borderline: 遇到衝突時選擇迴避或無條件妥協（People Pleaser），缺乏專業堅持。 描述過於抽象，無法舉出具體的衝突案例。 Solid: 面對分歧能用數據或邏輯說服他人，且保持對事不對人的態度。 願意傾聽他人意見，並為了團隊目標做出合理的 Trade-off。 Outstanding: Win-Win：不僅解決衝突，還改善了團隊關係或流程。 展現極高的同理心 (Empathy)，能理解反對者的出發點並轉化為助力。 3. Growth Mindset \u0026amp; Resilience (成長思維與韌性) 面對失敗與挑戰的反應。沒人是完美的，重點是**「如何從錯誤中學習」**。\nPoor: 聲稱「我從來沒有失敗過」或給出虛假的缺點（例如：「我最大的缺點就是太追求完美」）。 防衛心重，面試官追問細節時變得情緒化。 Borderline: 承認錯誤，但沒有具體的改進計畫。 將錯誤輕描淡寫，缺乏深刻的反省。 Solid: 誠實面對失敗，並能清楚說明「學到了什麼」以及「之後如何避免重蹈覆轍」。 展現出對新技術或反饋的渴求。 Outstanding: Systemic Fix：失敗後不僅修正自己，還建立了機制（如寫文檔、加測試、優化流程）防止團隊其他人犯同樣錯誤。 展現出極強的抗壓性與適應模糊 (Ambiguity) 的能力。 4. Communication \u0026amp; Structure (溝通結構與真實性) 表達是否清晰、真誠，邏輯是否連貫。\nPoor: 回答冗長、抓不到重點 (Rambling)。 背誦痕跡明顯，像機器人一樣唸稿。 前後矛盾，被追問時露出馬腳（涉嫌造假）。 Borderline: 故事跳躍，需要面試官反覆引導才能聽懂全貌。 過於拘謹或緊張，無法進行自然的對話。 Solid: 回答精簡有力 (Concise)，架構清晰 (Top-down communication)。 態度真誠自信，能與面試官建立連結。 Outstanding: Storytelling：像講故事一樣引人入勝，讓面試官印象深刻。 能根據面試官的反應即時調整詳略程度。 最終決策矩陣 (Hiring Decision) Behavioral 面試有時具有「一票否決權」。技術再強，如果是 Toxic 的人，通常也是 NH。\n評級 全稱 判斷標準 (校準會議視角) SNH Strong No Hire 絕對紅旗。展現出傲慢、欺騙、指責他人、性別/種族歧視傾向，或溝通完全無法進行。此類評價通常會留下永久紀錄。 NH No Hire 文化不符或資歷造假。回答空洞，無法證明其貢獻；或過於被動，不具備工程師應有的 Problem Solving 特質。 LNH Lean No Hire 平庸且缺乏亮點。雖然沒有大錯，但回答像流水帳，看不出潛力或熱情。感覺像是一個「只想找份差事 (Job)」而非「經營職涯 (Career)」的人。 LH Lean Hire 安全牌。溝通順暢，符合核心價值，但故事缺乏深度或影響力較小。如果技術面試很強，這關算過。 H Hire 理想同事。故事具體、邏輯清晰，展現出良好的反省能力與團隊精神。你會願意以後每天跟這個人一起工作。 SH Strong Hire Bar Raiser (提高標準)。展現出超越 Entry Level 的成熟度（如主動承擔跨組溝通、建立團隊文化）。這種人是團隊未來的 Leader。 常見例題 (Example Questions) 在準備時，請針對每個類別準備 2-3 個不同的故事 (STAR 格式)。\n1. 衝突與影響力 (Conflict \u0026amp; Influence)\n\u0026ldquo;Tell me about a time you disagreed with a team member or manager. How did you handle it?\u0026rdquo; (意見分歧) \u0026ldquo;Describe a time when you had to convince someone to accept your technical approach.\u0026rdquo; (說服他人) 2. 挑戰與失敗 (Challenge \u0026amp; Failure)\n\u0026ldquo;Tell me about a time you failed to meet a deadline or commitment. What happened?\u0026rdquo; (錯過死線/失敗) \u0026ldquo;Give me an example of a difficult bug you tracked down. Why was it hard?\u0026rdquo; (技術挑戰) 3. 主動性與模糊性 (Ownership \u0026amp; Ambiguity)\n\u0026ldquo;Tell me about a time you went above and beyond your job description.\u0026rdquo; (展現當責) \u0026ldquo;Describe a situation where you had to make a decision with incomplete information.\u0026rdquo; (處理模糊狀況) 4. 建設性回饋 (Feedback)\n\u0026ldquo;Tell me about a piece of constructive feedback you received. How did you react?\u0026rdquo; (接受回饋) Next Step: 需要我挑選其中一題（例如：「請分享一次你失敗的經驗」），讓你試著用 STAR 原則回答，我再幫你進行「模擬評分」與「修飾」嗎？\n",
    "permalink": "/posts/interview/",
    "summary": "\u003cp\u003e這是一篇從 FAANG（現多指 MANGA：Meta, Amazon, Netflix, Google, Apple）資深面試官視角出發，針對 Entry Level (L3/E3) 軟體工程師的面試評分指南。\u003c/p\u003e\n\u003cp\u003e我們在評估初階工程師時，並非期待全知全能，而是尋找**「可塑性高、基礎扎實、溝通順暢」**的合作夥伴。\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"面試官評分四大維度-the-4-pillars\"\u003e面試官評分四大維度 (The 4 Pillars)\u003c/h3\u003e\n\u003ch4 id=\"1-data-structures--algorithms-dsa\"\u003e1. Data Structures \u0026amp; Algorithms (DSA)\u003c/h4\u003e\n\u003cp\u003e這是核心門檻，評估候選人是否具備將抽象問題轉化為邏輯解法的能力。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePoor (不及格):\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e無法理解題目或將問題建模。\u003c/li\u003e\n\u003cli\u003e只能提出暴力解 (Brute Force)，完全不考慮複雜度。\u003c/li\u003e\n\u003cli\u003e對基本資料結構（如 Map, Set, Stack）使用時機錯誤。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBorderline (邊緣):\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e能夠給出最佳解 (Optimal Solution)，但在分析時間/空間複雜度時猶豫或出錯。\u003c/li\u003e\n\u003cli\u003e需要面試官給予大量提示 (Heavy hinting) 才能得出正確演算法。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSolid (合格):\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e能獨立提出最佳解，例如將 $O(N^2)$ 優化至 $O(N \\log N)$ 或 $O(N)$。\u003c/li\u003e\n\u003cli\u003e準確分析複雜度，並能解釋 Trade-off（例如：以空間換取時間）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOutstanding (優秀):\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e除了最佳解，還能探討不同解法的優劣。\u003c/li\u003e\n\u003cli\u003e能迅速處理 Follow-up 問題（例如：資料量過大無法放入記憶體時怎麼辦）。\u003c/li\u003e\n\u003cli\u003e展現出對底層原理的深刻理解（例如：Hash Collision 的處理機制）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"2-coding-程式實作能力\"\u003e2. Coding (程式實作能力)\u003c/h4\u003e\n\u003cp\u003e有了演算法，候選人能否將想法轉換為「乾淨、可執行、無 Bug」的程式碼。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ePoor:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e語法錯誤頻發，連標準庫都不熟悉。\u003c/li\u003e\n\u003cli\u003e邏輯混亂，變數命名無意義（如 \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003etemp1\u003c/code\u003e）。\u003c/li\u003e\n\u003cli\u003e無法處理指標或遞迴邏輯，導致 Crash 或無窮迴圈。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBorderline:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e程式碼可執行，但風格髒亂（Spaghetti Code），缺乏模組化。\u003c/li\u003e\n\u003cli\u003e有明顯的 Off-by-one error 或邊界條件處理遺漏。\u003c/li\u003e\n\u003cli\u003ePython 寫得像 C，沒有善用語言特性（Unidiomatic）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSolid:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e程式碼結構清晰，命名規範（Google Style Guide），縮排正確。\u003c/li\u003e\n\u003cli\u003e實作速度快，能將複雜邏輯拆解為 Helper Functions。\u003c/li\u003e\n\u003cli\u003e熟練使用標準庫（如 C++ STL 或 Python \u003ccode\u003ecollections\u003c/code\u003e）。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOutstanding:\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eProduction Ready Code\u003c/strong\u003e：考慮到擴展性、異常處理 (Error Handling)。\u003c/li\u003e\n\u003cli\u003e程式碼極其精簡優雅，閱讀起來像讀文章。\u003c/li\u003e\n\u003cli\u003e一次寫對 (One-shot pass)，幾乎不需要修改語法錯誤。\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"3-efficacy--verification-解決問題效能與驗證\"\u003e3. Efficacy / Verification (解決問題效能與驗證)\u003c/h4\u003e\n\u003cp\u003e這點常被候選人忽略。這不只是「解出來」，而是「如何確保解法正確」以及「解決問題的節奏」。\u003c/p\u003e"
  },
  {
    "title": "Invariant",
    "content": "這是一篇關於二分搜尋法（Binary Search）變體、Python 實作與正確性證明的技術文章。\n二分搜尋法 (Binary Search)：區間定義與正確性證明 二分搜尋法的核心難點在於邊界處理（Off-by-one error）。解決此問題的最佳理論工具是 迴圈不變量 (Loop Invariant)。\n本文將針對三種場景：尋找特定值、尋找左側邊界 (bisect_left)、尋找右側邊界 (bisect_right)，分別展示 左閉右閉 [L, R] 與 左閉右開 [L, R) 的實作，並證明其正確性。\n1. 核心理論：迴圈不變量 (Loop Invariant) 在二分搜尋中，我們維護一個「搜尋區間」，並保證目標值（若存在）或目標插入點永遠位於該區間內。\n初始化 (Initialization): 迴圈開始前，不變量成立。 維持 (Maintenance): 每次迭代縮小區間後，不變量依然成立。 終止 (Termination): 迴圈結束時，區間縮小至空或一點，此時的狀態即為答案。 時間複雜度證明 (Master Theorem): 遞迴關係式：$T(n) = T(n/2) + O(1)$ 根據主定理 (Master Theorem) Case 2 ($a=1, b=2, d=0$)，複雜度為 $\\Theta(\\log n)$。\n2. 尋找特定目標值 (Find Exact Target) 目標：若 nums 中存在 target，返回索引；否則返回 -1。\n2.1 左閉右閉區間 [left, right] 定義: 搜尋區間為 $nums[left \\dots right]$。 不變量: 若 $target$ 存在，則 $target \\in nums[left \\dots right]$。 終止條件: left \u0026gt; right (區間為空)。 def search_closed(nums: list[int], target: int) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Finds target in a sorted list using [L, R].\u0026#34;\u0026#34;\u0026#34; left, right = 0, len(nums) - 1 while left \u0026lt;= right: mid = left + (right - left) // 2 # Prevent overflow if nums[mid] == target: return mid elif nums[mid] \u0026lt; target: left = mid + 1 # [mid+1, right] else: right = mid - 1 # [left, mid-1] return -1 2.2 左閉右開區間 [left, right) 定義: 搜尋區間為 $nums[left \\dots right-1]$。 不變量: 若 $target$ 存在，則 $target \\in nums[left \\dots right-1]$。 終止條件: left == right (區間為空)。 def search_open(nums: list[int], target: int) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Finds target in a sorted list using [L, R).\u0026#34;\u0026#34;\u0026#34; left, right = 0, len(nums) while left \u0026lt; right: mid = left + (right - left) // 2 if nums[mid] == target: return mid elif nums[mid] \u0026lt; target: left = mid + 1 # [mid+1, right) else: right = mid # [left, mid) return -1 3. 尋找左側邊界 (bisect_left) 目標：尋找第一個滿足 $nums[k] \\ge target$ 的索引 $k$。等同於 C++ std::lower_bound。\n3.1 左閉右閉區間 [left, right] 此寫法較為少見，因為最後需要判斷 left 落點。\n不變量: $nums[0 \\dots left-1] \u0026lt; target$ 且 $nums[right+1 \\dots n-1] \\ge target$。 維護: 若 $nums[mid] \\ge target$，則答案在左側（含 mid），right = mid - 1。 若 $nums[mid] \u0026lt; target$，則答案在右側，left = mid + 1。 終止: left \u0026gt; right，此時 left 指向第一個 $\\ge target$ 的值。 def bisect_left_closed(nums: list[int], target: int) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Finds insertion point for target using [L, R].\u0026#34;\u0026#34;\u0026#34; left, right = 0, len(nums) - 1 while left \u0026lt;= right: mid = left + (right - left) // 2 if nums[mid] \u0026lt; target: left = mid + 1 else: right = mid - 1 return left 3.2 左閉右開區間 [left, right) (Python 標準庫實作) 不變量: 候選區間 $nums[left \\dots right)$ 包含插入點。 維護: 若 $nums[mid] \u0026lt; target$，left = mid + 1。 若 $nums[mid] \\ge target$，right = mid (保留 mid 作為潛在答案)。 def bisect_left_open(nums: list[int], target: int) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Finds insertion point for target using [L, R).\u0026#34;\u0026#34;\u0026#34; left, right = 0, len(nums) while left \u0026lt; right: mid = left + (right - left) // 2 if nums[mid] \u0026lt; target: left = mid + 1 else: right = mid return left 4. 尋找右側邊界 (bisect_right) 目標：尋找第一個滿足 $nums[k] \u0026gt; target$ 的索引 $k$。等同於 C++ std::upper_bound。\n4.1 左閉右閉區間 [left, right] 不變量: $nums[0 \\dots left-1] \\le target$ 且 $nums[right+1 \\dots n-1] \u0026gt; target$。 維護: 若 $nums[mid] \\le target$，則答案在右側，left = mid + 1。 若 $nums[mid] \u0026gt; target$，則答案在左側（含 mid），right = mid - 1。 def bisect_right_closed(nums: list[int], target: int) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Finds insertion point after target using [L, R].\u0026#34;\u0026#34;\u0026#34; left, right = 0, len(nums) - 1 while left \u0026lt;= right: mid = left + (right - left) // 2 if nums[mid] \u0026lt;= target: left = mid + 1 else: right = mid - 1 return left 4.2 左閉右開區間 [left, right) (Python 標準庫實作) 維護: 若 $nums[mid] \\le target$，left = mid + 1。 若 $nums[mid] \u0026gt; target$，right = mid。 def bisect_right_open(nums: list[int], target: int) -\u0026gt; int: \u0026#34;\u0026#34;\u0026#34;Finds insertion point after target using [L, R).\u0026#34;\u0026#34;\u0026#34; left, right = 0, len(nums) while left \u0026lt; right: mid = left + (right - left) // 2 if nums[mid] \u0026lt;= target: left = mid + 1 else: right = mid return left 總結對照表 變體類型 區間寫法 Loop 條件 Right 更新 Left 更新 用途 Search Target [L, R] L \u0026lt;= R mid - 1 mid + 1 找確切值 Search Target [L, R) L \u0026lt; R mid mid + 1 找確切值 Bisect Left ($\\ge$) [L, R] L \u0026lt;= R mid - 1 mid + 1 Lower Bound Bisect Left ($\\ge$) [L, R) L \u0026lt; R mid mid + 1 Lower Bound Bisect Right ($\u0026gt;$) [L, R] L \u0026lt;= R mid - 1 mid + 1 Upper Bound Bisect Right ($\u0026gt;$) [L, R) L \u0026lt; R mid mid + 1 Upper Bound 註：在 bisect 類型的實作中，無論是閉區間還是開區間，最終收斂時 left 即為所求答案。\n",
    "permalink": "/posts/invariant/",
    "summary": "\u003cp\u003e這是一篇關於二分搜尋法（Binary Search）變體、Python 實作與正確性證明的技術文章。\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"二分搜尋法-binary-search區間定義與正確性證明\"\u003e二分搜尋法 (Binary Search)：區間定義與正確性證明\u003c/h1\u003e\n\u003cp\u003e二分搜尋法的核心難點在於邊界處理（Off-by-one error）。解決此問題的最佳理論工具是 \u003cstrong\u003e迴圈不變量 (Loop Invariant)\u003c/strong\u003e。\u003c/p\u003e\n\u003cp\u003e本文將針對三種場景：\u003cstrong\u003e尋找特定值\u003c/strong\u003e、\u003cstrong\u003e尋找左側邊界 (\u003ccode\u003ebisect_left\u003c/code\u003e)\u003c/strong\u003e、\u003cstrong\u003e尋找右側邊界 (\u003ccode\u003ebisect_right\u003c/code\u003e)\u003c/strong\u003e，分別展示 \u003cstrong\u003e左閉右閉 \u003ccode\u003e[L, R]\u003c/code\u003e\u003c/strong\u003e 與 \u003cstrong\u003e左閉右開 \u003ccode\u003e[L, R)\u003c/code\u003e\u003c/strong\u003e 的實作，並證明其正確性。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"1-核心理論迴圈不變量-loop-invariant\"\u003e1. 核心理論：迴圈不變量 (Loop Invariant)\u003c/h2\u003e\n\u003cp\u003e在二分搜尋中，我們維護一個「搜尋區間」，並保證目標值（若存在）或目標插入點永遠位於該區間內。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e初始化 (Initialization)\u003c/strong\u003e: 迴圈開始前，不變量成立。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e維持 (Maintenance)\u003c/strong\u003e: 每次迭代縮小區間後，不變量依然成立。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e終止 (Termination)\u003c/strong\u003e: 迴圈結束時，區間縮小至空或一點，此時的狀態即為答案。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e時間複雜度證明 (Master Theorem):\u003c/strong\u003e\n遞迴關係式：$T(n) = T(n/2) + O(1)$\n根據主定理 (Master Theorem) Case 2 ($a=1, b=2, d=0$)，複雜度為 $\\Theta(\\log n)$。\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"2-尋找特定目標值-find-exact-target\"\u003e2. 尋找特定目標值 (Find Exact Target)\u003c/h2\u003e\n\u003cp\u003e目標：若 \u003ccode\u003enums\u003c/code\u003e 中存在 \u003ccode\u003etarget\u003c/code\u003e，返回索引；否則返回 \u003ccode\u003e-1\u003c/code\u003e。\u003c/p\u003e\n\u003ch3 id=\"21-左閉右閉區間-left-right\"\u003e2.1 左閉右閉區間 \u003ccode\u003e[left, right]\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e定義\u003c/strong\u003e: 搜尋區間為 $nums[left \\dots right]$。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e不變量\u003c/strong\u003e: 若 $target$ 存在，則 $target \\in nums[left \\dots right]$。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e終止條件\u003c/strong\u003e: \u003ccode\u003eleft \u0026gt; right\u003c/code\u003e (區間為空)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003esearch_closed\u003c/span\u003e(nums: list[int], target: int) \u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e int:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u0026#34;Finds target in a sorted list using [L, R].\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  left, right \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e, len(nums) \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e left \u003cspan style=\"color:#f92672\"\u003e\u0026lt;=\u003c/span\u003e right:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    mid \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e left \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e (right \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e left) \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e  \u003cspan style=\"color:#75715e\"\u003e# Prevent overflow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e nums[mid] \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e target:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e mid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eelif\u003c/span\u003e nums[mid] \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e target:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      left \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e mid \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e  \u003cspan style=\"color:#75715e\"\u003e# [mid+1, right]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      right \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e mid \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e  \u003cspan style=\"color:#75715e\"\u003e# [left, mid-1]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"22-左閉右開區間-left-right\"\u003e2.2 左閉右開區間 \u003ccode\u003e[left, right)\u003c/code\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e定義\u003c/strong\u003e: 搜尋區間為 $nums[left \\dots right-1]$。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e不變量\u003c/strong\u003e: 若 $target$ 存在，則 $target \\in nums[left \\dots right-1]$。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e終止條件\u003c/strong\u003e: \u003ccode\u003eleft == right\u003c/code\u003e (區間為空)。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003esearch_open\u003c/span\u003e(nums: list[int], target: int) \u003cspan style=\"color:#f92672\"\u003e-\u0026gt;\u003c/span\u003e int:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;\u0026#34;\u0026#34;Finds target in a sorted list using [L, R).\u0026#34;\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  left, right \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e, len(nums)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e left \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e right:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    mid \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e left \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e (right \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e left) \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eif\u003c/span\u003e nums[mid] \u003cspan style=\"color:#f92672\"\u003e==\u003c/span\u003e target:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e mid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eelif\u003c/span\u003e nums[mid] \u003cspan style=\"color:#f92672\"\u003e\u0026lt;\u003c/span\u003e target:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      left \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e mid \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e  \u003cspan style=\"color:#75715e\"\u003e# [mid+1, right)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      right \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e mid  \u003cspan style=\"color:#75715e\"\u003e# [left, mid)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"3-尋找左側邊界-bisect_left\"\u003e3. 尋找左側邊界 (\u003ccode\u003ebisect_left\u003c/code\u003e)\u003c/h2\u003e\n\u003cp\u003e目標：尋找第一個滿足 $nums[k] \\ge target$ 的索引 $k$。等同於 C++ \u003ccode\u003estd::lower_bound\u003c/code\u003e。\u003c/p\u003e"
  },
  {
    "title": "書單",
    "content": "Reading List 理論基礎 Nand To Tetris\nCSAPP\nComputation Theory\n程式語言 工具 Haskell\nPython\nC++\nGit\nUnicorn\n心法 Mythical Man Month\nSWE Book\nThe Pragmatic Programmer\n論文 Attention\nSAIS\nOthers 心理學\nUVM\nPrompts 生成工程師面向的簡報，不需生成普羅大眾的通識簡報，越技術越好，可以盡量的曲高和寡。 需要包含前言，分章節細節，總結。 分章節細節要有盡量多的技術細節。 生成工程師面向圖卡，不需生成普羅大眾的通識，越技術越好，可以盡量的曲高和寡。 需要包含前言，分章節細節，總結。 分章節細節要有盡量多的技術細節。 ",
    "permalink": "/posts/my-first-blog-post/",
    "summary": "\u003ch1 id=\"reading-list\"\u003eReading List\u003c/h1\u003e\n\u003ch2 id=\"理論基礎\"\u003e理論基礎\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/5ec4d58a-6c7b-4077-b863-52788d7c49be\"\u003eNand To Tetris\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/29ef4492-42ec-4ea6-8e10-bef14c82b97a\"\u003eCSAPP\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/b7b0006a-078b-4fcb-9395-b6b804738046\"\u003eComputation Theory\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"程式語言-工具\"\u003e程式語言 工具\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/dd8c9351-1ee7-42db-bdf5-a967eabc2ebc\"\u003eHaskell\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/16889723-efdf-4b4c-b721-d04890e06074\"\u003ePython\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/902d7efa-168b-4922-8944-53cbce878f27\"\u003eC++\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/63f7f47b-844c-4570-a658-b4a11fe170f0\"\u003eGit\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/6634da94-fe34-4fa4-bd87-37b099a6384c\"\u003eUnicorn\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"心法\"\u003e心法\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/2157cada-74f2-4ba2-ad01-71d8e0d5035a\"\u003eMythical Man Month\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/de79bf97-8d3c-40f4-a161-1749fd13b87a\"\u003eSWE Book\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/69868bcd-584a-491a-975d-7f445940bf4c\"\u003eThe Pragmatic Programmer\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"論文\"\u003e論文\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/30767c45-a13e-4035-b694-414cbc09e93a\"\u003eAttention\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/bac3bb29-81b6-4a98-b1b9-692449c4f0ff\"\u003eSAIS\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"others\"\u003eOthers\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/558d232d-83c2-44e4-840f-607fabed9b1c\"\u003e心理學\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://notebooklm.google.com/notebook/c2fe9d0b-fa51-4348-836d-50ff083a594e\"\u003eUVM\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch1 id=\"prompts\"\u003ePrompts\u003c/h1\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e生成工程師面向的簡報，不需生成普羅大眾的通識簡報，越技術越好，可以盡量的曲高和寡。\n需要包含前言，分章節細節，總結。\n分章節細節要有盡量多的技術細節。\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e生成工程師面向圖卡，不需生成普羅大眾的通識，越技術越好，可以盡量的曲高和寡。\n需要包含前言，分章節細節，總結。\n分章節細節要有盡量多的技術細節。\n\u003c/code\u003e\u003c/pre\u003e"
  },
  {
    "title": "",
    "content": "Fenwick Tree\nfrom unittest import TestCase class Fenwick: def __init__(self, n): self.n = n self.tree = [0] * (n + 1) def add(self, i, delta): while i \u0026lt;= self.n: self.tree[i] += delta i += i \u0026amp; -i def sum(self, i): res = 0 while i \u0026gt; 0: res += self.tree[i] i -= i \u0026amp; -i return res def sum_range(self, i, j): return self.sum(j) - self.sum(i - 1) class TestFenwick(TestCase): def test_fenwick(self): tree = Fenwick(10) tree.add(1, 1) tree.add(2, 2) tree.add(3, 3) self.assertEqual(tree.sum(1), 1) self.assertEqual(tree.sum(2), 3) self.assertEqual(tree.sum(3), 6) self.assertEqual(tree.sum(2, 3), 5) tree.add(1, 100) self.assertEqual(tree.sum(3), 106) ",
    "permalink": "/codebook/fenwick/",
    "summary": "\u003cp\u003eFenwick Tree\u003c/p\u003e\n\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003efrom\u003c/span\u003e unittest \u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e TestCase\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eFenwick\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e __init__(self, n):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003en \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etree \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e (n \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eadd\u003c/span\u003e(self, i, delta):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e\u0026lt;=\u003c/span\u003e self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003en:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etree[i] \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e delta\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            i \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ei\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003esum\u003c/span\u003e(self, i):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        res \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ewhile\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            res \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003etree[i]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            i \u003cspan style=\"color:#f92672\"\u003e-=\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003e\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003ei\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e res\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003esum_range\u003c/span\u003e(self, i, j):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#66d9ef\"\u003ereturn\u003c/span\u003e self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(j) \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(i \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003eTestFenwick\u003c/span\u003e(TestCase):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#66d9ef\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#a6e22e\"\u003etest_fenwick\u003c/span\u003e(self):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        tree \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e Fenwick(\u003cspan style=\"color:#ae81ff\"\u003e10\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eadd(\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eadd(\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eadd(\u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eassertEqual(tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e), \u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eassertEqual(tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e), \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eassertEqual(tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(\u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e), \u003cspan style=\"color:#ae81ff\"\u003e6\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eassertEqual(tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e), \u003cspan style=\"color:#ae81ff\"\u003e5\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eadd(\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#ae81ff\"\u003e100\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003eassertEqual(tree\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esum(\u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e), \u003cspan style=\"color:#ae81ff\"\u003e106\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e"
  },
  {
    "title": "Educational DP Contest",
    "content": "Educational DP Contest A - Frog 1 你有 N 個平台。平台編號為 1, 2, \u0026hellip;, N。對於每個 i (1 ≤ i ≤ N)，平台 i 的高度是 h_i。\n最初，一隻青蛙在平台 1 上。\n青蛙重複以下動作，試圖到達平台 N：\n當青蛙在平台 i 上時，它跳到平台 i + 1 或 i + 2。 當跳到平台 j 時，它支付成本 |h_i - h_j|。 求青蛙到達平台 N 所需支付的最小總成本。\nn = int(input()) h = list(map(int, input().split())) dp = [0] * n dp[1] = abs(h[1] - h[0]) for i in range(2, n): dp[i] = min(dp[i-1] + abs(h[i] - h[i-1]), dp[i-2] + abs(h[i] - h[i-2])) print(dp[-1]) B - Frog 2 有 N 個立足點。立足點的編號是 1, 2, \u0026hellip;, N。對每個 i (1 ≤ i ≤ N)，立足點 i 的高度是 h_i。\n最初，青蛙在立足點 1。青蛙重複以下行動若干次，試圖到達立足點 N。當青蛙在立足點 i 時，可以跳到立足點 i + 1, i + 2, \u0026hellip;, i + K 中的任意一個。此時，如果跳到的立足點是 j，則需要支付成本 |h_i - h_j|。\n求青蛙到達立足點 N 之前需要支付的總成本的最小值。\nn, k = map(int, input().split()) h = list(map(int, input().split())) dp = [0] * n for i in range(1, n): dp[i] = min(dp[i-j] + abs(h[i] - h[i-j]) for j in range(1, min(i+1, k+1))) print(dp[-1]) C - Vacation 明日太郎君的暑假就要開始了。\n太郎君決定要規劃他的暑假。暑假總共有 N 天。\n對每一個 i (1 ≤ i ≤ N)，在第 i 天，太郎君可以選擇以下其中一項活動：\nA：去海邊游泳。獲得幸福度 a_i。 B：去山上抓蟲。獲得幸福度 b_i。 C：在家裡寫作業。獲得幸福度 c_i。 太郎君很容易感到厭倦，所以他不能連續兩天或更多天做相同的活動。\n請找出太郎君能獲得的最大總幸福度。\nD - Knapsack 1 有 N 個物品。物品編號為 1, 2, \u0026hellip;, N。 對於每個 i (1 ≤ i ≤ N)，物品 i 的重量為 wᵢ，價值為 vᵢ。 太郎君要從 N 個物品中選擇一些，放入背包帶走。 背包的容量為 W，帶走的物品的重量總和必須 ≤ W。 請找出太郎君帶走的物品的價值總和的最大值。\n限制：\n所有輸入皆為整數。 1 ≤ N ≤ 100 1 ≤ W ≤ 10⁵ 1 ≤ wᵢ ≤ W 1 ≤ vᵢ ≤ 10⁹ E - Knapsack 2 限制：\n所有輸入都是整數。 1 ≤ N ≤ 100 1 ≤ W ≤ 10⁹ 1 ≤ wᵢ ≤ W 1 ≤ vᵢ ≤ 10³ F - LCS 給定字串 s 和 t。請找出 s 的子序列，同時也是 t 的子序列的最長字串之一。\n註解\n字串 x 的子序列是指從 x 中移除 0 個或更多字元後，將剩餘字元按原始順序連接起來所形成的字串。\n限制\ns 和 t 都是由小寫英文字母組成的字串。 1 ≤ |s|, |t| ≤ 3000 G - Longest Path 問題：\n給定一個有向圖G，包含N個頂點和M條邊。頂點的編號為1, 2, \u0026hellip;, N。對於每個 i (1 ≤ i ≤ M)，第 i 條有向邊從頂點 x_i 指向頂點 y_i。圖G不包含有向環。\n求G中，最長有向路徑的長度。\n有向路徑的長度定義為路徑中包含的邊的數量。\n限制：\n所有輸入皆為整數。 2 ≤ N ≤ 10^5 1 ≤ M ≤ 10^5 1 ≤ x_i, y_i ≤ N 所有的 (x_i, y_i) 對都是不同的。 圖G不包含有向環。 H - Grid 1 給定一個 H 行 W 列的網格。 用 (i, j) 表示從上到下第 i 行，從左到右第 j 列的方格。 對於每個 i, j (1 ≤ i ≤ H, 1 ≤ j ≤ W)，方格 (i, j) 的資訊由字元 a_{i, j} 給出。如果 a_{i, j} 是 .，則方格 (i, j) 是空方格；如果 a_{i, j} 是 #，則方格 (i, j) 是牆方格。 保證方格 (1, 1) 和 (H, W) 是空方格。\n太郎君從方格 (1, 1) 出發，通過重複向右或向下移動到相鄰的空方格，來嘗試到達方格 (H, W)。 從方格 (1, 1) 到 (H, W) 的太郎君的路徑有多少種？ 由於答案可能非常大，請計算對 10^9 + 7 取模的結果。\n條件：\nH 和 W 是整數。 2 ≤ H, W ≤ 1000 a_{i, j} 是 . 或 #。 方格 (1, 1) 和 (H, W) 是空方格。 I - Coins 題目敘述\n給定一個正奇數 N。有 N 枚硬幣，編號為 1, 2, \u0026hellip;, N。對於每個 i (1 ≤ i ≤ N)，當你拋擲硬幣 i 時，正面朝上的機率是 pᵢ，反面朝上的機率是 1 - pᵢ。太郎將所有 N 枚硬幣都拋擲了。請求出正面朝上的硬幣數量多於反面朝上的硬幣數量的機率。\n條件\nN 是一個奇數。 1 ≤ N ≤ 2999 pᵢ 是一個實數，最多有兩位小數。 0 \u0026lt; pᵢ \u0026lt; 1 J - Sushi 你有 N 個盤子。盤子上分別標記著 1, 2, \u0026hellip;, N。 最初，對於每個 i (1 ≤ i ≤ N)，盤子 i 上有 aᵢ (1 ≤ aᵢ ≤ 3) 個壽司。 直到所有壽司都被吃光，太郎都會重複進行以下操作：\n擲一個骰子，骰子的每個面出現的概率相等，骰子的點數為 1, 2, \u0026hellip;, N。 假設骰子的點數為 i。如果盤子 i 上有壽司，則吃掉盤子 i 上的一個壽司。 如果盤子 i 上沒有壽司，則什麼也不做。 請求出所有壽司都被吃光之前，操作次數的期望值。\nK - Stones 給定一個由 N 個正整數組成的集合 A = { a₁，a₂，…，aN }。\n太郎君和次郎君玩一個遊戲。\n首先，準備一堆由 K 個石頭組成的石堆。\n兩人輪流進行以下操作。\n先手是太郎君。從集合 A 中選擇一個元素 x，從石堆中恰好拿走 x 個石頭。\n無法再進行操作的人輸。\n假設兩人都採取最佳策略，判斷誰會獲勝。\nL - Deque 太郎君和次郎君進行一個遊戲。\n最初，給定一個數列 a = (a₁，a₂，…，aₙ)。 太郎君和次郎君輪流進行操作，直到數列 a 變為空。\n每次操作，玩家可以從數列 a 的開頭或結尾移除一個元素。 移除的元素值為 x，進行操作的玩家得到 x 分。\n遊戲結束時，太郎君的總得分為 X，次郎君的總得分為 Y。\n太郎君的目標是最大化 X - Y，而次郎君的目標是最小化 X - Y。\n假設兩人都採取最佳策略，請求出 X - Y 的值。\n條件\n所有輸入皆為整數。 1 ≤ N ≤ 3000 1 ≤ aᵢ ≤ 10⁹ M - Candies 有 N 個孩子。孩子的編號是 1, 2, \u0026hellip;, N。他們要分 K 個糖果。\n對於每個 i (1 ≤ i ≤ N)，孩子 i 得到的糖果數量必須是 0 以上且不超過 aᵢ。\n而且，糖果不能剩下。\n有多少種孩子們分配糖果的方法？答案對 10⁹ + 7 取模。\n如果存在一個孩子，他/她得到的糖果數量不同，則認為兩種方法是不同的。\n限制\n所有輸入都是整數。\n1 ≤ N ≤ 100\n0 ≤ K ≤ 10⁵\n0 ≤ aᵢ ≤ K\nN - Slimes 有 N 隻史萊姆排成一列。 最初，從左邊數起的第 i 隻史萊姆的大小是 a_i。 太郎想把所有史萊姆合併成一隻。 在史萊姆變成一隻之前，太郎會重複以下操作：\n選擇左右相鄰的兩隻史萊姆，將它們合併成一隻新的史萊姆。 當合併前兩隻史萊姆的大小分別為 x 和 y 時，合併後史萊姆的大小為 x + y。 此時，太郎需要支付 x + y 的成本。 史萊姆的位置關係在合併前後保持不變。\n請找出太郎需要支付的成本總和的最小值。\n限制：\n所有輸入都是整數。 2 ≤ N ≤ 400 1 ≤ a_i ≤ 10^9\nO - Matching 有 N 個男性和 N 個女性。男性編號為 1, 2, \u0026hellip;, N，女性也編號為 1, 2, \u0026hellip;, N。對於每對 i, j (1 ≤ i, j ≤ N)，用一個整數 a_{i, j} 來表示男性 i 和女性 j 的匹配程度。如果 a_{i, j} = 1，表示男性 i 和女性 j 相性良好，如果 a_{i, j} = 0，表示相性不好。\n太郎君希望找到所有相性良好的男女配對，使得形成 N 對。\n條件：\n每個男性和每個女性都必須恰好屬於一個配對。 你需要計算有多少種不同的方式可以形成 N 對配對。 答案對 10^9 + 7 取模。 1 ≤ N ≤ 21 a_{i, j} 的值只能是 0 或 1。 P - Independent Set 問題：\n給定一個有 N 個頂點的樹。 頂點編號為 1, 2, \u0026hellip;, N。 對於每個 i (1 ≤ i ≤ N - 1)，第 i 條邊連接頂點 xi 和 yi。 太郎君決定將每個頂點塗成白色或黑色。 但是，相鄰的頂點不能同時塗成黑色。 請問頂點的顏色組合有多少種？ 請對 10^9 + 7 取餘數。\n條件：\n所有輸入都是整數。 1 ≤ N ≤ 10^5 1 ≤ xi, yi ≤ N 給定的圖是一個樹。 Q - Flowers 有 N 朵花排成一列。\n對於每個 i (1 ≤ i ≤ N)，從左邊數來的第 i 朵花的高度是 h_i，美麗值是 a_i。\n此外，h_1, h_2, \u0026hellip;, h_N 彼此互不相同。\n太郎想移除一些花，使得以下條件成立：\n剩餘的花從左到右看，高度是單調遞增的。 請求出剩餘的花的美麗值總和的最大值。\n限制\n所有的輸入都是整數。 1 ≤ N ≤ 2 × 10^5 1 ≤ h_i ≤ N h_1, h_2, \u0026hellip;, h_N 彼此互不相同。 1 ≤ a_i ≤ 10^9 R - Walk 給定一個有 N 個頂點的簡單有向圖 G。 頂點編號為 1, 2, \u0026hellip;, N。 對於每個 i, j (1 ≤ i, j ≤ N)，由整數 a_{i, j} 給出從頂點 i 到 j 的有向邊是否存在。 如果 a_{i, j} = 1，則存在從頂點 i 到 j 的有向邊；如果 a_{i, j} = 0，則不存在。\n請問 G 中有多少個長度為 K 的有向路徑？ 求出答案模 10^9 + 7 的結果。\n允許有向路徑多次經過相同的邊。\n限制：\n輸入的所有值都是整數。 1 ≤ N ≤ 50 1 ≤ K ≤ 10^{18} a_{i, j} 是 0 或 1。 a_{i, i} = 0\nS - Digit Sum 給定一個正整數 K 和一個正整數 D。請問有多少個介於 1 到 K 之間（包含 1 和 K）的整數，其十進位表示中所有數字的總和是 D 的倍數？ 答案對 10^9 + 7 取模。\n限制\n所有輸入都是整數。 1 ≤ K \u0026lt; 10^10000 1 ≤ D ≤ 100 T - Permutation 給定一個正整數 N。\n給定一個長度為 N - 1 的字符串 s，由 \u0026ldquo;\u0026lt;\u0026rdquo; 和 \u0026ldquo;\u0026gt;\u0026rdquo; 組成。\n尋找有多少個 (1, 2, \u0026hellip;, N) 的排列 (p_1, p_2, \u0026hellip;, p_N) 滿足以下條件？ 輸出答案模 10^9 + 7 的結果。\n對於每個 i (1 ≤ i ≤ N - 1)，如果 s 的第 i 個字符是 \u0026ldquo;\u0026lt;\u0026quot;，則 p_i \u0026lt; p_{i + 1}；如果 s 的第 i 個字符是 \u0026ldquo;\u0026gt;\u0026quot;，則 p_i \u0026gt; p_{i + 1}。\n約束\nN 是一個整數。 2 ≤ N ≤ 3000 s 是一個長度為 N - 1 的字符串。 s 僅由 \u0026ldquo;\u0026lt;\u0026rdquo; 和 \u0026ldquo;\u0026gt;\u0026rdquo; 組成。 U - Grouping 有 N 隻兔子。\n兔子們的編號是 1, 2, \u0026hellip;, N。\n對於每對 i, j (1 ≤ i, j ≤ N)，兔子 i 和 j 的相容性由整數 a_{i, j} 給定。\n對於每個 i (1 ≤ i ≤ N) , a_{i, i} = 0，並且對於每個 i, j (1 ≤ i, j ≤ N), a_{i, j} = a_{j, i}。\n太郎君想將這 N 隻兔子分成幾個群組。\n此時，每隻兔子必須恰好屬於一個群組。\n作為分組的結果，對於每對 i, j (1 ≤ i \u0026lt; j ≤ N)，如果兔子 i 和 j 屬於同一個群組，太郎君會得到 a_{i, j} 分。\n求太郎君總得分的最大值。\n限制\n所有輸入都是整數。 1 ≤ N ≤ 16 |a_{i, j}| ≤ 10^9 a_{i, i} = 0 a_{i, j} = a_{j, i}\nV - Subtree 題目描述\n給定一個有 N 個節點的樹。 節點編號從 1 到 N。 對於每個 i ( 1 ≤ i ≤ N - 1 )，第 i 條邊連接節點 x_i 和 y_i。 太郎決定將每個節點塗成白色或黑色。 在這個情況下，所有黑色的節點之間，都能只通過黑色的節點到達彼此。 給定正整數 M。 對於每個 v ( 1 ≤ v ≤ N )，回答以下問題： 有多少種節點塗色的方法，使得節點 v 是黑色的？ 輸出結果對 M 取模。\n條件\n所有輸入都是整數。 1 ≤ N ≤ 10^5 2 ≤ M ≤ 10^9 1 ≤ x_i, y_i ≤ N 給定的圖是一個樹。 W - Intervals 考慮一個長度為 N 的由 0 和 1 構成的字符串。\n這個字符串的得分計算如下： 對於每個 i (1 ≤ i ≤ M)，如果從第 l_i 個字符到第 r_i 個字符之間至少包含一個 1，則將 a_i 加到得分中。 求字符串的最高得分。\n限制： 所有輸入都是整數。 1 ≤ N ≤ 2 × 10^5 1 ≤ M ≤ 2 × 10^5 1 ≤ l_i ≤ r_i ≤ N |a_i| ≤ 10^9\nX - Tower 你有 N 個積木。 每個積木都有一個編號 1, 2, \u0026hellip;, N。 對於每個 i (1 ≤ i ≤ N)，積木 i 的重量是 wi，堅固度是 si，價值是 vi。 太郎打算從 N 個積木中選擇一些，將它們以任意順序堆疊成塔。 這個塔必須滿足以下條件：對於塔中的每個積木 i，堆疊在積木 i 上的積木的總重量必須小於或等於 si。\n找出塔中積木的價值總和的最大值。\n條件\n所有輸入都是整數。 1 ≤ N ≤ 10^3 1 ≤ wi, si ≤ 10^4 1 ≤ vi ≤ 10^9 Y - Grid 2 有一個 H 行、W 列的網格。\n我們用 (i, j) 表示網格中從上數第 i 行、從左數第 j 列的格子。\n網格中有 N 個格子 (r₁ , c₁), (r₂ , c₂), \u0026hellip;, (rₙ , cₙ) 是牆壁格子，其餘的格子都是空的。\n保證格子 (1, 1) 和 (H, W) 是空的。\n太郎君從格子 (1, 1) 出發，重複向右或向下移動到相鄰的空格子，試圖到達格子 (H, W)。\n從格子 (1, 1) 到 (H, W) 太郎君的路徑有多少種？ 求出模 10⁹ + 7 的餘數。\n條件\n所有輸入都是整數。 2 ≤ H, W ≤ 10⁵ 1 ≤ N ≤ 3000 1 ≤ rᵢ ≤ H 1 ≤ cᵢ ≤ W 格子 (rᵢ, cᵢ) 都彼此不同。 格子 (1, 1) 和 (H, W) 是空的。 Z - Frog 3 有 N 個平台。 平台編號為 1, 2, \u0026hellip;, N。 對於每個 i (1 ≤ i ≤ N)，平台 i 的高度為 h_i。 這裡， h_1 \u0026lt; h_2 \u0026lt; \u0026hellip; \u0026lt; h_N。 最初，青蛙在平台 1 上。 青蛙重複以下行動若干次，試圖到達平台 N。 當青蛙在平台 i 上時，它跳到平台 i + 1, i + 2, \u0026hellip;, N 中的任何一個。 此時，如果跳到的平台是 j，則需要支付成本 (h_j - h_i)^2 + C。 求青蛙到達平台 N 之前需要支付的成本總和的最小值。\n條件：\n所有輸入均為整數。 2 ≤ N ≤ 2 × 10^5 1 ≤ C ≤ 10^{12} 1 ≤ h_1 \u0026lt; h_2 \u0026lt; \u0026hellip; \u0026lt; h_N ≤ 10^6 ",
    "permalink": "/atcoder/dp/",
    "summary": "\u003ch1 id=\"educational-dp-contest\"\u003e\u003ca href=\"https://atcoder.jp/contests/dp\"\u003eEducational DP Contest\u003c/a\u003e\u003c/h1\u003e\n\u003ch2 id=\"a---frog-1\"\u003e\u003ca href=\"https://atcoder.jp/contests/dp/tasks/dp_a\"\u003eA - Frog 1\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e你有 N 個平台。平台編號為 1, 2, \u0026hellip;, N。對於每個 i (1 ≤ i ≤ N)，平台 i 的高度是 h_i。\u003c/p\u003e\n\u003cp\u003e最初，一隻青蛙在平台 1 上。\u003c/p\u003e\n\u003cp\u003e青蛙重複以下動作，試圖到達平台 N：\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e當青蛙在平台 i 上時，它跳到平台 i + 1 或 i + 2。\u003c/li\u003e\n\u003cli\u003e當跳到平台 j 時，它支付成本 |h_i - h_j|。\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e求青蛙到達平台 N 所需支付的最小總成本。\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003en \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e int(input())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eh \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e list(map(int, input()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esplit()))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edp \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e [\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edp[\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e abs(h[\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e h[\u003cspan style=\"color:#ae81ff\"\u003e0\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#66d9ef\"\u003efor\u003c/span\u003e i \u003cspan style=\"color:#f92672\"\u003ein\u003c/span\u003e range(\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e, n):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  dp[i] \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e min(dp[i\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e abs(h[i] \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e h[i\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e]), dp[i\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e] \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e abs(h[i] \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e h[i\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(dp[\u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#ae81ff\"\u003e1\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"b---frog-2\"\u003e\u003ca href=\"https://atcoder.jp/contests/dp/tasks/dp_b\"\u003eB - Frog 2\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e有 N 個立足點。立足點的編號是 1, 2, \u0026hellip;, N。對每個 i (1 ≤ i ≤ N)，立足點 i 的高度是 h_i。\u003c/p\u003e"
  },
  {
    "title": "ExtGcd",
    "content": "在數論和演算法競賽中，我們經常需要在模運算 (Modular Arithmetic) 的環境下進行除法。然而，模運算中沒有直接的除法操作。取而代之的是，我們需要找到一個數的「模乘法反元素」，並將除法轉換為乘法。\n本文將介紹什麼是模乘法反元素，以及如何使用擴展歐幾里得算法 (Extended Euclidean Algorithm, ExtGcd) 來高效地找到它。\n什麼是模乘法反元素？ 對於兩個整數 a 和 m，如果存在一個整數 x 滿足以下同餘方程式：\na * x ≡ 1 (mod m) 那麼，我們稱 x 是 a 在模 m 下的模乘法反元素 (Modular Multiplicative Inverse)。\n有了反元素 x，當我們想計算 b / a (mod m) 時，就可以轉換為計算 b * x (mod m)，從而實現模運算中的「除法」。\n反元素的存在條件 並不是所有的 a 在模 m 下都有反元素。反元素存在的充分必要條件是 a 和 m 互質 (coprime)，也就是說它們的最大公因數 (Greatest Common Divisor, GCD) 為 1。\ngcd(a, m) = 1\n如果 gcd(a, m) ≠ 1，那麼 a 在模 m 下的乘法反元素不存在。\n擴展歐幾里得算法 (ExtGcd) 擴展歐幾里得算法是歐幾里得算法的延伸。它不僅能計算出兩個整數 a 和 b 的最大公因數 d，還能同時找到一對整數 x 和 y，使得它們滿足貝祖定理 (Bézout\u0026rsquo;s identity)：\na * x + b * y = gcd(a, b) 如何利用 ExtGcd 找反元素？ 現在，讓我們把這個公式與模乘法反元素的需求聯繫起來。我們想找的反元素 x 滿足：\na * x ≡ 1 (mod m) 這等價於存在一個整數 k，使得：\na * x = 1 + k * m 移項後得到：\na * x - k * m = 1 令 y = -k，上式變為：\na * x + m * y = 1 這和擴展歐幾里得算法的結果 a * x + m * y = gcd(a, m) 非常相似！\n當 a 和 m 互質時，gcd(a, m) = 1，此時擴展歐幾里得算法給出的 x 和 y 正好滿足 a * x + m * y = 1。\n對這個等式兩邊取模 m：\n(a * x + m * y) mod m = 1 mod m (a * x) mod m + (m * y) mod m = 1 a * x ≡ 1 (mod m) 瞧！擴展歐幾里得算法所求出的 x，正是 a 在模 m 下的乘法反元素。\n需要注意的是，算法求出的 x 可能是負數。我們需要將其轉換為 [0, m-1] 範圍內的等價正整數，常用的方法是 (x % m + m) % m。\nPython 實作 以下是使用 Python 實作的擴展歐幾里得算法，並用它來求解模乘法反元素。\ndef ext_gcd(a, b): \u0026#34;\u0026#34;\u0026#34; 擴展歐幾里得算法 返回 (gcd, x, y) 使得 a*x + b*y = gcd(a, b) \u0026#34;\u0026#34;\u0026#34; if b == 0: return a, 1, 0 else: gcd, x, y = ext_gcd(b, a % b) # a*x + b*y = gcd(a,b) # b*x\u0026#39; + (a%b)*y\u0026#39; = gcd(b, a%b) # a%b = a - floor(a/b)*b # b*x\u0026#39; + (a - floor(a/b)*b)*y\u0026#39; = gcd # a*y\u0026#39; + b*(x\u0026#39; - floor(a/b)*y\u0026#39;) = gcd # So, x = y\u0026#39;, y = x\u0026#39; - floor(a/b)*y\u0026#39; return gcd, y, x - (a // b) * y def mod_inverse(a, m): \u0026#34;\u0026#34;\u0026#34; 計算 a 在模 m 下的乘法反元素 \u0026#34;\u0026#34;\u0026#34; gcd, x, y = ext_gcd(a, m) if gcd != 1: # 反元素不存在 raise ValueError(f\u0026#34;Inverse does not exist for a={a}, m={m} as gcd is {gcd}\u0026#34;) # 將 x 調整到 [0, m-1] 的範圍內 return (x % m + m) % m # --- 範例 --- a = 7 m = 26 try: inv = mod_inverse(a, m) print(f\u0026#34;{a} 在模 {m} 下的反元素是: {inv}\u0026#34;) print(f\u0026#34;驗證: ({a} * {inv}) % {m} = {(a * inv) % m}\u0026#34;) except ValueError as e: print(e) # --- 另一個範例 --- a = 4 m = 10 try: inv = mod_inverse(a, m) print(f\u0026#34;{a} 在模 {m} 下的反元素是: {inv}\u0026#34;) except ValueError as e: print(e) 總結 模乘法反元素是模運算中不可或缺的工具，它讓我們能將除法問題轉化為乘法問題。透過擴展歐幾里得算法，我們可以在 a 和 m 互質的前提下，快速且有效地計算出反元素。這個算法不僅在理論上優雅，在實際應用（如密碼學、演算法競賽）中也扮演著關鍵角色。\n",
    "permalink": "/number-theory/extgcd-modular-inverse/",
    "summary": "\u003cp\u003e在數論和演算法競賽中，我們經常需要在模運算 (Modular Arithmetic) 的環境下進行除法。然而，模運算中沒有直接的除法操作。取而代之的是，我們需要找到一個數的「模乘法反元素」，並將除法轉換為乘法。\u003c/p\u003e\n\u003cp\u003e本文將介紹什麼是模乘法反元素，以及如何使用\u003cstrong\u003e擴展歐幾里得算法 (Extended Euclidean Algorithm, ExtGcd)\u003c/strong\u003e 來高效地找到它。\u003c/p\u003e\n\u003ch2 id=\"什麼是模乘法反元素\"\u003e什麼是模乘法反元素？\u003c/h2\u003e\n\u003cp\u003e對於兩個整數 \u003ccode\u003ea\u003c/code\u003e 和 \u003ccode\u003em\u003c/code\u003e，如果存在一個整數 \u003ccode\u003ex\u003c/code\u003e 滿足以下同餘方程式：\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea * x ≡ 1 (mod m)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e那麼，我們稱 \u003ccode\u003ex\u003c/code\u003e 是 \u003ccode\u003ea\u003c/code\u003e 在模 \u003ccode\u003em\u003c/code\u003e 下的\u003cstrong\u003e模乘法反元素\u003c/strong\u003e (Modular Multiplicative Inverse)。\u003c/p\u003e\n\u003cp\u003e有了反元素 \u003ccode\u003ex\u003c/code\u003e，當我們想計算 \u003ccode\u003eb / a (mod m)\u003c/code\u003e 時，就可以轉換為計算 \u003ccode\u003eb * x (mod m)\u003c/code\u003e，從而實現模運算中的「除法」。\u003c/p\u003e\n\u003ch2 id=\"反元素的存在條件\"\u003e反元素的存在條件\u003c/h2\u003e\n\u003cp\u003e並不是所有的 \u003ccode\u003ea\u003c/code\u003e 在模 \u003ccode\u003em\u003c/code\u003e 下都有反元素。反元素存在的\u003cstrong\u003e充分必要條件\u003c/strong\u003e是 \u003ccode\u003ea\u003c/code\u003e 和 \u003ccode\u003em\u003c/code\u003e 互質 (coprime)，也就是說它們的最大公因數 (Greatest Common Divisor, GCD) 為 1。\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003egcd(a, m) = 1\u003c/strong\u003e\u003c/p\u003e\u003c/blockquote\u003e\n\u003cp\u003e如果 \u003ccode\u003egcd(a, m) ≠ 1\u003c/code\u003e，那麼 \u003ccode\u003ea\u003c/code\u003e 在模 \u003ccode\u003em\u003c/code\u003e 下的乘法反元素不存在。\u003c/p\u003e"
  },
  {
    "title": "Japanese Resource",
    "content": "无敌绿宝书 N1词汇 无中文版本 读两遍，磨耳朵（已更完）\n",
    "permalink": "/jp/",
    "summary": "\u003cp\u003e\u003ca href=\"https://www.bilibili.com/video/BV1nM411v7nx/?vd_source=4d8afae76db1a6a390b4721fda5a166b\"\u003e无敌绿宝书 N1词汇 无中文版本 读两遍，磨耳朵（已更完）\u003c/a\u003e\u003c/p\u003e"
  },
  {
    "title": "Linux Kernel Driver 開發流程與實用技巧",
    "content": "Linux Kernel Driver 開發是一項充滿挑戰但也極具回報的工作。它要求開發者不僅要熟悉 C 語言，還要對作業系統的底層機制有深入的理解。在這篇文章中，我將分享一些關於 Linux Kernel Driver 開發的流程與實用技巧，希望能幫助初學者更快上手。\n1. 環境建置 (Environment Setup) 工欲善其事，必先利其器。一個好的開發環境可以大大提升效率。\nQEMU 虛擬機 直接在實體機上開發 Kernel Driver 風險較高，容易導致系統崩潰。使用 QEMU 搭配一個精簡的 Root Filesystem (如 Buildroot 或 Busybox) 是一個非常流行且安全的做法。\n優點: 啟動速度快，崩潰後重啟方便，易於調試。 啟動命令範例: qemu-system-x86_64 -kernel arch/x86/boot/bzImage \\ -initrd initramfs.cpio.gz \\ -append \u0026#34;console=ttyS0\u0026#34; \\ -nographic Cross Compiler 如果你是在 x86 架構上開發 ARM 或 RISC-V 的 Driver，你需要安裝 Cross Compiler (如 aarch64-linux-gnu-gcc)。\n2. 開發流程 (Development Workflow) 標準的 Kernel Driver 開發流程通常包含以下步驟：\n編寫代碼 (Coding): 實現 Driver 的功能，通常包含 module_init 和 module_exit。 編寫 Makefile: Kernel Module 的 Makefile 有特定的格式。 obj-m += mydriver.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 編譯 (Build): 執行 make 產生 .ko (Kernel Object) 檔案。 載入 (Load): 使用 insmod mydriver.ko 載入模組。 測試 (Test): 測試 Driver 功能。 卸載 (Unload): 使用 rmmod mydriver 卸載模組。 查看 Log: 使用 dmesg 查看 Kernel Log。 3. 除錯技巧 (Debugging Techniques) Kernel Space 的除錯比 User Space 困難許多，因為沒有 GDB 這樣方便的工具 (雖然可以使用 KGDB，但設定較繁瑣)。\nprintk 這是最基本也最常用的除錯方式。\n使用 pr_info(), pr_err(), pr_debug() 等巨集來替代裸 printk，這樣可以更容易控制 Log Level。 Dynamic Debug: 如果 Kernel 開啟了 CONFIG_DYNAMIC_DEBUG，可以在 runtime 動態開啟或關閉特定檔案或函數的 debug log。 ftrace Linux Kernel 內建的強大追蹤工具。\n可以追蹤函數呼叫圖 (Function Graph)。 可以測量函數執行時間，找出效能瓶頸。 使用 trace-cmd 前端工具會更方便。 Oops 與 Panic 分析 當 Driver 發生嚴重錯誤 (如 Null Pointer Dereference) 時，Kernel 會印出 Oops 訊息。學會解讀 Call Trace 和 Register Dump 是定位問題的關鍵。\n4. 實用技巧與最佳實踐 (Tips \u0026amp; Best Practices) Coding Style: 遵守 Linux Kernel Coding Style (使用 scripts/checkpatch.pl 檢查)。 Concurrency: 注意 Race Condition，正確使用 Spinlock, Mutex 等同步機制。 Memory Management: Kernel Stack 很小 (通常只有 8KB 或 16KB)，避免在 Stack 上宣告大型陣列。使用 kmalloc/kfree 時要注意 Memory Leak。 善用現有 API: Kernel 提供了豐富的 API (Linked List, Hash Table, Workqueue 等)，不要重複造輪子。 閱讀源碼: 遇到問題時，閱讀現有的 Driver 原始碼往往是最好的解決方案 (LXR 網站很好用)。 結語 Linux Kernel Driver 開發雖然門檻較高，但只要掌握了正確的工具和方法，就能夠游刃有餘。希望這篇文章能為你的 Kernel 之旅提供一些指引。Happy Hacking!\n",
    "permalink": "/linux/kernel-driver/",
    "summary": "\u003cp\u003eLinux Kernel Driver 開發是一項充滿挑戰但也極具回報的工作。它要求開發者不僅要熟悉 C 語言，還要對作業系統的底層機制有深入的理解。在這篇文章中，我將分享一些關於 Linux Kernel Driver 開發的流程與實用技巧，希望能幫助初學者更快上手。\u003c/p\u003e\n\u003ch2 id=\"1-環境建置-environment-setup\"\u003e1. 環境建置 (Environment Setup)\u003c/h2\u003e\n\u003cp\u003e工欲善其事，必先利其器。一個好的開發環境可以大大提升效率。\u003c/p\u003e\n\u003ch3 id=\"qemu-虛擬機\"\u003eQEMU 虛擬機\u003c/h3\u003e\n\u003cp\u003e直接在實體機上開發 Kernel Driver 風險較高，容易導致系統崩潰。使用 QEMU 搭配一個精簡的 Root Filesystem (如 Buildroot 或 Busybox) 是一個非常流行且安全的做法。\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e優點\u003c/strong\u003e: 啟動速度快，崩潰後重啟方便，易於調試。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e啟動命令範例\u003c/strong\u003e:\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eqemu-system-x86_64 -kernel arch/x86/boot/bzImage \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e                   -initrd initramfs.cpio.gz \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e                   -append \u003cspan style=\"color:#e6db74\"\u003e\u0026#34;console=ttyS0\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ae81ff\"\u003e\u003c/span\u003e                   -nographic\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"cross-compiler\"\u003eCross Compiler\u003c/h3\u003e\n\u003cp\u003e如果你是在 x86 架構上開發 ARM 或 RISC-V 的 Driver，你需要安裝 Cross Compiler (如 \u003ccode\u003eaarch64-linux-gnu-gcc\u003c/code\u003e)。\u003c/p\u003e\n\u003ch2 id=\"2-開發流程-development-workflow\"\u003e2. 開發流程 (Development Workflow)\u003c/h2\u003e\n\u003cp\u003e標準的 Kernel Driver 開發流程通常包含以下步驟：\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003e編寫代碼 (Coding)\u003c/strong\u003e: 實現 Driver 的功能，通常包含 \u003ccode\u003emodule_init\u003c/code\u003e 和 \u003ccode\u003emodule_exit\u003c/code\u003e。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e編寫 Makefile\u003c/strong\u003e: Kernel Module 的 Makefile 有特定的格式。\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-makefile\" data-lang=\"makefile\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eobj-m \u003cspan style=\"color:#f92672\"\u003e+=\u003c/span\u003e mydriver.o\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eall\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    make -C /lib/modules/\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eshell uname -r\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e/build M\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePWD\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e modules\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#a6e22e\"\u003eclean\u003c/span\u003e\u003cspan style=\"color:#f92672\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    make -C /lib/modules/\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003eshell uname -r\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e/build M\u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#66d9ef\"\u003e$(\u003c/span\u003ePWD\u003cspan style=\"color:#66d9ef\"\u003e)\u003c/span\u003e clean\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e編譯 (Build)\u003c/strong\u003e: 執行 \u003ccode\u003emake\u003c/code\u003e 產生 \u003ccode\u003e.ko\u003c/code\u003e (Kernel Object) 檔案。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e載入 (Load)\u003c/strong\u003e: 使用 \u003ccode\u003einsmod mydriver.ko\u003c/code\u003e 載入模組。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e測試 (Test)\u003c/strong\u003e: 測試 Driver 功能。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e卸載 (Unload)\u003c/strong\u003e: 使用 \u003ccode\u003ermmod mydriver\u003c/code\u003e 卸載模組。\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e查看 Log\u003c/strong\u003e: 使用 \u003ccode\u003edmesg\u003c/code\u003e 查看 Kernel Log。\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"3-除錯技巧-debugging-techniques\"\u003e3. 除錯技巧 (Debugging Techniques)\u003c/h2\u003e\n\u003cp\u003eKernel Space 的除錯比 User Space 困難許多，因為沒有 GDB 這樣方便的工具 (雖然可以使用 KGDB，但設定較繁瑣)。\u003c/p\u003e"
  },
  {
    "title": "Math Algo",
    "content": "Algo and Math 001 - Print 5+N print(int(input()) + 5) 002 - Sum of 3 Integers print(sum(map(int, input().split()))) 003 - Sum of N Integers input() print(sum(map(int, input().split()))) 004 - Product of 3 Integers import functools import operator print(functools.reduce(operator.mul, map(int, input().split()))) 005 - Modulo 100 input() print(sum(map(int, input().split())) % 100) 006 - Print 2N+3 print(int(input()) * 2 + 3) 007 - Number of Multiples 1 在不超過 N 的正整數中，有多少個數是 X 的倍數，或者 Y 的倍數？\nimport math n, x, y = map(int, input().split()) print(n // x + n // y - n // math.lcm(x, y)) 008 - Brute Force 1 你有兩張卡片，分別是紅色和藍色，你需要在每張卡片上寫下 1 到 N 之間的整數。有多少種寫法可以讓卡片上數字的總和不超過 S？\n1 ≤ N ≤ 1000 1 ≤ S ≤ 2000 $$\\sum_x\\sum_y |(x + y \\leq S)|$$\nn, s = map(int, input().split()) print(sum(x + y \u0026lt;= s for x in range(1, n + 1) for y in range(1, n + 1))) 009 - Brute Force 2 有 N 張卡片排成一列。第 i 張卡片 (1 ≤ i ≤ N) 上寫著整數 $A_i$。 請問是否可以從卡片中選擇一些，使得它們的總和恰好為 S？\n1 ≤ N ≤ 60 1 ≤ $A_i$ ≤ 10000 1 ≤ S ≤ 10000 輸入皆為整數 n, s = map(int, input().split()) v = [False] * (s + 1) v[0] = True for x in map(int, input().split()): v = [v[i] or (i \u0026gt;= x and v[i - x]) for i in range(s + 1)] print([\u0026#34;No\u0026#34;, \u0026#34;Yes\u0026#34;][v[s]]) 010 - Factorial import math print(math.factorial(int(input()))) import functools import operator fac = lambda n: functools.reduce(operator.mul, range(1, n + 1), 1) print(fac(int(input()))) 011 - Print Prime Numbers 請按照由小到大的順序，列印出所有不大於 N 的質數。\nn = int(input()) ans = [] for i in range(2, n + 1): if all(i % x != 0 for x in ans): ans.append(i) print(*ans) (Cont) 篩法解 sieve:\nn = int(input()) p = [True] * (n + 1) p[0] = p[1] = False ans = [] for i in range(2, n + 1): if p[i]: ans.append(i) for j in range(i * i, n + 1, i): p[j] = False print(*ans) sieve2\ndef sieve(a): return [a[0]] + sieve([x for x in a[1:] if x % a[0] != 0]) if a else [] print(sieve(list(range(2, 1000)))) 012 - Primality Test 請判斷給定的數字 N 是否為質數。\nimport math n = int(input()) ans = all(n % i != 0 for i in range(2, math.isqrt(n) + 1)) print([\u0026#34;No\u0026#34;, \u0026#34;Yes\u0026#34;][ans]) 013 - Divisor Enumeration 給定一個整數 N。請列舉 N 的所有因數。\nimport math n = int(input()) ans = [] for i in range(1, math.isqrt(n) + 1): if n % i == 0: ans.append(i) if i != n // i: ans.append(n // i) print(*sorted(ans)) 014 - Factorization 將自然數 N 進行質因數分解。\nn = int(input()) i = 2 ans = [] while i * i \u0026lt;= n: while n % i == 0: ans.append(i) n //= i i += 1 if n \u0026gt; 1: ans.append(n) print(*ans) 015 - Calculate GCD 請找出 A 和 B 的最大公約數。\n限制\n1 ≤ A, B ≤ 109 A 和 B 為整數 a, b = map(int, input().split()) gcd = lambda a, b : a if b == 0 else gcd(b, a % b) print(gcd(a, b)) 016 - Greatest Common Divisor of N Integers 給定 N 個正整數 $A_1, A_2, \\dots, A_N$，請計算它們的最大公約數。\nimport math input() print(math.gcd(*map(int, input().split()))) 017 - Least Common Multiple of N Integers 給定 N 個正整數 $A_1, A_2, \\dots, A_N$，請計算它們的最小公倍數。\nimport math input() print(math.lcm(*map(int, input().split()))) 018 - Convenience Store 1 便利商店裡賣有 N 種商品，第 i 種商品（1 ≤ i ≤ N）的價格是 $A_i$ 元。\n從不同的兩種商品中，總金額為 500 元的方法有多少種？\n限制\n2 ≤ N ≤ 200000 $A_i$ 是 100、200、300、400 其中之一 所有輸入皆為整數 from collections import defaultdict d = defaultdict(int) int(input()) ans = 0 for x in map(int, input().split()): ans += d[500 - x] d[x] += 1 print(ans) 019 - Choose Cards 1 有 N 張卡片，從左到右編號為 i（1 ≤ i ≤ N），第 i 張卡片的顏色是 $A_i$。當 $A_i$=1 時為紅色，$A_i$=2 時為黃色，$A_i$=3 時為藍色。有多少種選擇 2 張相同顏色卡片的方法？\nfrom collections import defaultdict d = defaultdict(int) int(input()) ans = 0 for x in map(int, input().split()): ans += d[x] d[x] += 1 print(ans) 020 - Choose Cards 2 你有 N 張卡片，從左到右，第 i 張卡片上寫著一個整數 A_i。\n請問有多少種選擇 5 張卡片的方法，使得選中的卡片上所寫的整數的總和恰好是 1000？\nimport functools n = int(input()) a = list(map(int, input().split())) @functools.cache def dp(i, sel, remain): if remain == 0 and sel == 0: return 1 if i \u0026lt; 0 or remain \u0026lt;= 0 or sel \u0026lt;= 0: return 0 return dp(i - 1, sel, remain) + dp(i - 1, sel - 1, remain - a[i]) print(dp(n - 1, 5, 1000)) 021 - Combination Easy 給定整數 n 和 r。\n請編寫一個程式，計算並輸出 ${}_n\\mathrm{C}_r$。\n限制條件\n1 ≤ r ≤ n ≤ 20 所有輸入皆為整數 from functools import cache @cache def nCr(n, r): if r == 0 or r == n: return 1 if r \u0026gt; n: return 0 return nCr(n - 1, r) + nCr(n - 1, r - 1) n, r = map(int, input().split()) print(nCr(n, r)) from math import factorial as f n, r = map(int, input().split()) print(f(n) // (f(r) * f(n - r))) 022 - Choose Cards 3 你有 N 張卡片，每張卡片上寫著一個整數，左邊第 i 張卡片上的數字是 A_i。\n請寫一個程式，計算有多少種選擇兩張卡片的方法，使得這兩張卡片上的數字之和為 100000。\nfrom collections import defaultdict d = defaultdict(int) int(input()) ans = 0 for x in map(int, input().split()): ans += d[100000 - x] d[x] += 1 print(ans) 023 - Dice Expectation 你有兩個 N 面骰子，分別為藍色和紅色。每個骰子的點數如下：\n藍色骰子：以相同的機率顯示 B₁，B₂，\u0026hellip;，Bₙ。 紅色骰子：以相同的機率顯示 R₁，R₂，\u0026hellip;，Rₙ。 你同時擲這兩個骰子，而你獲得的獎金金額等於兩個骰子點數的總和。請你計算你獲得獎金的期望值。\nn = int(input()) f = lambda : sum(map(int, input().split())) / n print(f() + f()) 024 - Answer Exam Randomly 一個國語測驗有 N 道題目，所有題目都是選擇題。 第 i 題 (1 ≤ i ≤ N) 有 P_i 個選項，其中只有一個是正確答案，每題配點為 Q_i 分。 太郎君完全沒有頭緒，決定隨機回答所有題目。 請計算太郎君能獲得的點數的期望值。\nn = int(input()) ans = 0 for _ in range(n): p, q = map(int, input().split()) ans += q / p print(ans) 025 - Jiro\u0026rsquo;s Vacation 次郎君的暑假有 N 天。\n他決定第 i 天 (1 ≤ i ≤ N) 的學習時間，按照以下步驟：\n每天早上擲骰子。 如果擲出 1 或 2：學習 Ai 小時。 如果擲出 3、4、5 或 6：學習 Bi 小時。 請編寫一個程式來計算他在整個暑假的總學習時間的期望值。\nn = int(input()) ans = 0 for a, b in zip(map(int, input().split()), map(int, input().split())): ans += a / 3 + b * 2 / 3 print(ans) 026 - Coin Gacha 你有一台機器，每次投入 1 美元，就會等機率地出現 N 種不同種類的硬幣中的一種。\n請你編寫一個程式，計算收集所有 N 種硬幣所需的期望花費金額。\n條件\n2 ≤ N ≤ 106 N 是一個整數 n = int(input()) print(sum(n / i for i in range(1, n + 1))) 027 - Sorting 給定一個長度為 N 的數組 [A₁，A₂，\u0026hellip;，Aₙ]。\n請基於書中描述的「進行合併排序的未完成程序」，編寫一個對數組進行升序排序的程序。\n限制\n通過正確解答名為 \u0026ldquo;small\u0026rdquo; 的測試案例，可以獲得 50% 的分數。 \u0026ldquo;small\u0026rdquo; 測試案例滿足以下限制： 2 ≤ N ≤ 2000 1 ≤ Aᵢ ≤ 10⁹ 所有輸入都是整數 通過正確解答滿足以下限制的測試案例，可以獲得全部的分數： 2 ≤ N ≤ 200000 1 ≤ Aᵢ ≤ 10⁹ 所有輸入都是整數 import heapq input() a = list(map(int, input().split())) heapq.heapify(a) ans = [] while a: ans.append(heapq.heappop(a)) print(*ans) 028 - Frog 1 有 N 個平台。平台編號為 1, 2, \u0026hellip;, N。對於每個 i (1 ≤ i ≤ N)，平台 i 的高度為 h_i。 起初，青蛙在平台 1 上。青蛙重複以下行動若干次，試圖到達平台 N。\n當青蛙在平台 i 上時，跳到平台 i + 1 或 i + 2。此時，跳躍到的平台是 j，需要支付成本 |h_i - h_j|。 求青蛙到達平台 N 所需支付的總成本的最小值。\nn = int(input()) a = list(map(int, input().split())) dp = [0] * n for i in range(1, n): dp[i] = dp[i - 1] + abs(a[i] - a[i - 1]) if i \u0026gt;= 2: dp[i] = min(dp[i], dp[i - 2] + abs(a[i] - a[i - 2])) print(dp[-1]) 029 - Climb Stairs 太郎君想要爬上 N 級台階。他可以一次爬 1 級或 2 級台階。他從第 0 級台階開始，計算有多少種不同的方式可以到達第 N 級台階。\n限制\n1 ≤ N ≤ 45 N 是一個整數 a, b = 0, 1 for _ in range(int(input())): a, b = b, b + a print(b) 030 - Knapsack 1 有 N 個物品。物品有編號 1, 2, \u0026hellip;, N。對於每個 i ( 1 ≤ i ≤ N )，物品 i 的重量是 wᵢ，價值是 vᵢ。太郎君從 N 個物品中選擇一些，放進背包裡帶走。背包的容量是 W，帶走的物品的總重量必須 ≤ W。求太郎君帶走的物品的價值總和的最大值。\n$$ dp[i][j] = \\begin{cases} 0 \u0026amp; \\text{if } i = 0 \\text{ or } j = 0 \\newline dp[i-1][j] \u0026amp; \\text{if } w_i \u0026gt; j \\newline \\max(dp[i-1][j], dp[i-1][j-w_i] + v_i) \u0026amp; \\text{if } w_i \\le j \\end{cases} $$\nn, m = map(int, input().split()) dp = [0] * (m + 1) for _ in range(n): w, v = map(int, input().split()) for i in range(m, w - 1, -1): dp[i] = max(dp[i], dp[i - w] + v) print(dp[m]) 031 - Taro\u0026rsquo;s Vacation 太郎君的暑假有 N 天，已知如果他在第 i 天學習，他的實力會增加 A_i 。但是，他不想連續兩天都學習。請你編寫一個程式，計算太郎君在暑假期間最多能提升多少實力。\n條件：\n2 ≤ N ≤ 500000 0 ≤ A_i ≤ 10^9 所有輸入皆為整數 input() rest, study = 0, 0 for x in map(int, input().split()): study, rest = max(rest + x, study), max(study, rest) print(max(study, rest)) 032 - Binary Search 給你一個長度為 N 的數組 A = [A_1, \u0026hellip;, A_N]，以及一個詢問（查詢）。\n詢問的內容如下：\n詢問：元素 X 是否在數組 A 中？\n請編寫一個程式，針對給定的詢問，輸出答案。\n限制\n1 ≤ N ≤ 10^5 1 ≤ X ≤ 10^9 1 ≤ A_i ≤ 10^9 所有輸入皆為整數。\nimport bisect n, x = map(int, input().split()) a = sorted(list(map(int, input().split()))) index = bisect.bisect_left(a, x) print([\u0026#34;No\u0026#34;, \u0026#34;Yes\u0026#34;][index \u0026lt; n and a[index] == x]) 033 - Distance 在二維平面上有點A, B, C。點 A 的坐標是 (a_x, a_y)，點 B 的坐標是 (b_x, b_y)，點 C 的坐標是 (c_x, c_y)。\n求點 A 與線段 BC 上點的最短距離。\nimport math read_point = lambda : tuple(map(int, input().split())) a, b, c = read_point(), read_point(), read_point() dot = lambda p1, p2 : p1[0] * p2[0] + p1[1] * p2[1] sub = lambda p1, p2 : (p1[0] - p2[0], p1[1] - p2[1]) ba = sub(a, b) bc = sub(c, b) ac = sub(c, a) t = dot(ba, bc) / dot(bc, bc) if 0 \u0026lt;= t \u0026lt;= 1: proj = (b[0] + bc[0] * t, b[1] + bc[1] * t) print(math.hypot(*sub(proj, a))) else: print(min(math.hypot(*ba), math.hypot(*ac))) complex流派:\n$$\\text{conj}(a) \\cdot b = (a_r + a_i i)(b_r - b_i i) = a_r b_r + a_i b_i + i(a_i b_r - a_r b_i) = \\vec{a} \\cdot \\vec{b} + i(\\vec{a} \\times \\vec{b})$$\n$$\\text{Re}(\\text{conj}(a) \\cdot b) = \\vec{a} \\cdot \\vec{b}$$ $$\\text{Im}(\\text{conj}(a) \\cdot b) = \\vec{a} \\times \\vec{b}$$\nread_point = lambda : complex(*map(int, input().split())) a, b, c = read_point(), read_point(), read_point() bc, ba = c - b, a - b t = (ba.conjugate() * bc).real / abs(bc) ** 2 if 0 \u0026lt;= t \u0026lt;= 1: proj = b + t * bc print(abs(a - proj)) else: print(min(abs(a - b), abs(a - c))) 034 - Nearest Points 在二維平面上有 N 個點，第 i 個點 (1 ≤ i ≤ N) 的坐標是 (x_i, y_i)。\n請找出距離最近的兩個點之間的距離。\n限制：\n2 ≤ N ≤ 2000 0 ≤ x_i, y_i ≤ 10^6 (1 ≤ i ≤ N) 所有輸入都是整數 import math import itertools n = int(input()) points = [tuple(map(int, input().split())) for _ in range(n)] print(min(math.dist(x, y) for x, y in itertools.combinations(points, 2))) 035 - Two Circles 在二維平面上有兩個圓，其資訊如下：\n第一個圓的圓心座標為 (x₁，y₁)，半徑為 r₁ 第二個圓的圓心座標為 (x₂，y₂)，半徑為 r₂ 這兩個圓的位置關係有以下五種情況：\n其中一個圓完全包含另一個圓，且兩個圓不相切。 其中一個圓完全包含另一個圓，且兩個圓相切。 兩個圓互相交錯。 兩個圓的內部沒有共同部分，但兩個圓相切。 兩個圓的內部沒有共同部分，且兩個圓不相切。 給定這兩個圓的資訊，請判斷它們屬於哪一種位置關係，並輸出對應的編號。\nimport math x1, y1, r1 = map(int, input().split()) x2, y2, r2 = map(int, input().split()) match (math.dist((x1, y1), (x2, y2)), r1, r2): case (d, r1, r2) if d \u0026lt; abs(r1 - r2): print(1) case (d, r1, r2) if d == abs(r1 - r2): print(2) case (d, r1, r2) if abs(r1 - r2) \u0026lt; d \u0026lt; r1 + r2: print(3) case (d, r1, r2) if d == r1 + r2: print(4) case (d, r1, r2) if d \u0026gt; r1 + r2: print(5) 036 - : (Colon) 考慮一個類比時鐘，其時針和分針的長度分別為 A 厘米和 B 厘米。時針和分針各自的一端固定在同一個固定點上，且它們繞該點以恆定的角速度順時針旋轉。時針需要 12 小時旋轉一圈，分針需要 1 小時旋轉一圈。在 0 時 0 分時，時針和分針重合。現在，給定時間恰好是 H 時 M 分，請問兩針未固定的一端之間的距離是多少厘米？\n首先計算時針和分針的角度（弧度制）：\n時針角度：$\\theta_h = (h/12 + m/720) \\times 2\\pi$ 分針角度：$\\theta_m = (m/60) \\times 2\\pi$ 使用複數表示時針和分針末端的位置：\n時針位置：$P_h = A \\cdot e^{i\\theta_h}$ 分針位置：$P_m = B \\cdot e^{i\\theta_m}$ 這裡使用歐拉公式 $e^{i\\theta} = \\cos\\theta + i\\sin\\theta$，將極坐標轉換為複平面上的點。\nimport math a, b, h, m = map(int, input().split()) angle_hour = (h / 12 + m / 720) * math.tau angle_minute = m / 60 * math.tau p_hour = a * (math.e ** complex(0, angle_hour)) p_minute = b * (math.e ** complex(0, angle_minute)) print(abs(p_hour - p_minute)) 037 - Intersection 在二維平面上，存在兩條線段。\n第一條線段連接點 (x₁，y₁) 和 (x₂，y₂)。 第二條線段連接點 (x₃，y₃) 和 (x₄，y₄)。\n如果這兩條線段相交，請輸出 Yes，如果它們不相交，請輸出 No。\n這裡，兩條線段相交指的是，存在一個點同時包含於這兩條線段。\nclass Point: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Point(self.x + other.x, self.y + other.y) def __sub__(self, other): return Point(self.x - other.x, self.y - other.y) def __mul__(self, scalar): return Point(self.x * scalar, self.y * scalar) def dot(self, other): return self.x * other.x + self.y * other.y def cross(self, other): return self.x * other.y - self.y * other.x def p_on_seg(p, a, b): return ( min(a.x, b.x) \u0026lt;= p.x \u0026lt;= max(a.x, b.x) and min(a.y, b.y) \u0026lt;= p.y \u0026lt;= max(a.y, b.y) and (p - a).cross(b - a) == 0 ) r = lambda: Point(*map(int, input().split())) a, b, c, d = r(), r(), r(), r() d1 = (b - a).cross(c - a) d2 = (b - a).cross(d - a) d3 = (d - c).cross(b - c) d4 = (d - c).cross(a - c) ans = ( (d1 * d2 \u0026lt; 0 and d3 * d4 \u0026lt; 0) or p_on_seg(a, c, d) or p_on_seg(b, c, d) or p_on_seg(c, a, b) or p_on_seg(d, a, b) ) print(\u0026#34;Yes\u0026#34; if ans else \u0026#34;No\u0026#34;) [!CAUTION] 這題如果使用浮點數運算可能會有精度問題。以下做法會得到一個WA。\nr = lambda: complex(*map(int, input().split())) a, b, c, d = r(), r(), r(), r() cross = lambda a, b: (a.conjugate() * b).imag def p_on_seg(p, a, b): return ( min(a.real, b.real) \u0026lt;= p.real \u0026lt;= max(a.real, b.real) and min(a.imag, b.imag) \u0026lt;= p.imag \u0026lt;= max(a.imag, b.imag) and cross(p - a, b - a) == 0 ) d1 = cross(b - a, c - a) d2 = cross(b - a, d - a) d3 = cross(d - c, b - c) d4 = cross(d - c, a - c) ans = ( (d1 * d2 \u0026lt; 0 and d3 * d4 \u0026lt; 0) or p_on_seg(a, c, d) or p_on_seg(b, c, d) or p_on_seg(c, a, b) or p_on_seg(d, a, b) ) print(\u0026#34;Yes\u0026#34; if ans else \u0026#34;No\u0026#34;) 038 - How Many Guests? 遊樂園「ALGO-RESORT」將舉辦為期 N 天的活動，第 i 天 (1 ≤ i ≤ N) 有 A_i 個人來訪。\n請撰寫程式回答以下總共 Q 個問題。\n第 1 個問題：從第 L_1 天到第 R_1 天的總來訪人數是多少？ 第 2 個問題：從第 L_2 天到第 R_2 天的總來訪人數是多少？ \u0026hellip; 第 Q 個問題：從第 L_Q 天到第 R_Q 天的總來訪人數是多少？ 限制\n1 ≤ N, Q ≤ 10^5 1 ≤ A_i ≤ 10000 1 ≤ L_i ≤ R_i ≤ N 所有輸入皆為整數 n, q = map(int, input().split()) s = [0] + list(map(int, input().split())) for i in range(1, n + 1): s[i] += s[i - 1] for _ in range(q): l, r = map(int, input().split()) print(s[r] - s[l - 1]) [!TIP] 前綴和\n039 - Snowy Days ALGO 國被分為 N 個區域，從西邊開始依次編號為 1 到 N。\n最初，所有區域都沒有積雪，但接下來的 Q 天將持續降雪。在第 i 天 (1 ≤ i ≤ Q)，區域 Lᵢ, Lᵢ₊₁, \u0026hellip;, Rᵢ 的積雪量預計將增加 Xᵢ cm。\n編寫一個程式，輸出一個長度為 N-1 的字串，表示降雪結束後各區域積雪量的大小關係。字串的第 i 個字符應如下：\n如果（區域 i 的積雪量）\u0026gt;（區域 i+1 的積雪量）：輸出 \u0026gt; 如果（區域 i 的積雪量）=（區域 i+1 的積雪量）：輸出 = 如果（區域 i 的積雪量）\u0026lt;（區域 i+1 的積雪量）：輸出 \u0026lt; 例如：\n如果積雪量從區域 1 開始依次為 [3 cm, 8 cm, 5 cm, 5 cm, 4 cm]，則正確的輸出為 \u0026lt;\u0026gt;=\u0026gt;。\n限制\n2 ≤ N ≤ 10⁵ 1 ≤ Q ≤ 10⁵ 1 ≤ Lᵢ ≤ Rᵢ ≤ N 1 ≤ Xᵢ ≤ 10000 所有輸入均為整數 n, q = map(int, input().split()) s = [0] * (n + 2) for _ in range(q): l, r, x = map(int, input().split()) s[l] += x s[r + 1] -= x for i in range(1, n + 1): s[i] += s[i - 1] for i in range(1, n): sgn = (s[i] \u0026gt; s[i + 1]) - (s[i] \u0026lt; s[i + 1]) print(\u0026#34;\u0026lt;=\u0026gt;\u0026#34;[sgn + 1], end=\u0026#39;\u0026#39;) print() [!TIP] imos法\n040 - Travel ALGO 鐵道資訊線上有 N 個車站，從西邊開始依序編號為 1 到 N。車站 i 和車站 i+1 (1 ≤ i ≤ N-1) 之間有雙向連接，距離為 A_i 公里。\n太郎君從車站 B_1 出發，依序經過車站 B_2, B_3, \u0026hellip;, B_{M-1}，最後在車站 B_M 結束旅程。請你計算他總共移動了多少公尺。\n限制\n2 ≤ N ≤ 200,000 2 ≤ M ≤ 200,000 1 ≤ A_i ≤ 10^7 (1 ≤ i ≤ N-1) 1 ≤ B_j ≤ N (1 ≤ j ≤ M) B_{j} ≠ B_{j+1} (1 ≤ j ≤ M-1) 所有輸入皆為整數 n = int(input()) coordinates = [0] * (n + 1) a = list(map(int, input().split())) for i in range(2, n + 1): coordinates[i] = coordinates[i - 1] + a[i - 2] m = int(input()) - 1 x = int(input()) ans = 0 for _ in range(m): y = int(input()) ans += abs(coordinates[x] - coordinates[y]) x = y print(ans) 041 - Convenience Store 2 某間便利商店在時刻 0 開門，在時刻 T 關門。這間便利商店有 N 位員工在工作，第 i 位員工（1 ≤ i ≤ N）在時刻 L_i 上班，在時刻 R_i 下班。請撰寫一個程式，對於 t = 0, 1, 2, \u0026hellip;, T-1，輸出在時刻 t+0.5 時，便利商店裡的員工數量。\n限制\n1 ≤ T ≤ 500,000 1 ≤ N ≤ 500,000 0 ≤ L_i \u0026lt; R_i ≤ T (1 ≤ i ≤ N) 所有輸入皆為整數 T = int(input()) n = int(input()) a = [0] * (T + 1) for _ in range(n): l, r = map(int, input().split()) a[l] += 1 a[r] -= 1 for i in range(1, T + 1): a[i] += a[i - 1] for i in range(T): print(a[i]) 042 - Sum of Divisors 對於正整數 X，我們定義 f(X) 為 X 的正因數的個數。 給定一個正整數 N，計算 $\\sum_{K=1}^N K * f(K)$。\n$1 ≤ N ≤ 10^7$\nn = int(input()) f = [1] * (n + 1) for i in range(2, n + 1): for j in range(i, n + 1, i): f[j] += 1 ans = 0 for i in range(1, n + 1): ans += i * f[i] print(ans) 043 - Depth First Search 給定一個有 N 個頂點 M 條邊的無向圖，頂點的編號分別為 1, 2, \u0026hellip;, N。第 i 條邊連接頂點 A_i 和頂點 B_i。\n如果整個圖是連通的，輸出: The graph is connected.\n否則，輸出: The graph is not connected.\nimport sys sys.setrecursionlimit(10 ** 6) n, m = map(int, input().split()) g = [[] for _ in range(n + 1)] vis = set() def dfs(u): if u in vis: return vis.add(u) for v in g[u]: dfs(v) for _ in range(m): u, v = map(int, input().split()) g[u].append(v) g[v].append(u) dfs(1) if len(vis) == n: print(\u0026#34;The graph is connected.\u0026#34;) else: print(\u0026#34;The graph is not connected.\u0026#34;) Disjoint set流派\nimport sys sys.setrecursionlimit(10 ** 6) n, m = map(int, input().split()) parent = list(range(n + 1)) def find(x): if parent[x] != x: parent[x] = find(parent[x]) return parent[x] for _ in range(m): u, v = map(int, input().split()) parent[find(u)] = find(v) if all(find(i) == find(1) for i in range(1, n + 1)): print(\u0026#34;The graph is connected.\u0026#34;) else: print(\u0026#34;The graph is not connected.\u0026#34;) 044 - Shortest Path 1 給定一個有 N 個頂點和 M 條邊的無向圖。每個頂點都有一個從 1 到 N 的編號，第 i 條邊連接頂點 A_i 和頂點 B_i。\n對於所有從 1 到 N 的整數 k，請回答以下問題：\n考慮從頂點 1 走到頂點 k，經過若干條邊。輸出需要經過的邊的最小數量。如果無法移動，則輸出 -1。\n約束：\n所有輸入都是整數 1 ≤ N ≤ 10^5 0 ≤ M ≤ min(10^5, N(N-1)/2) 1 ≤ A_i \u0026lt; B_i ≤ N 圖中沒有多重邊或自環。 from collections import deque q = deque() n, m = map(int, input().split()) g = [[] for _ in range(n + 1)] d = [-1] * (n + 1) d[1] = 0 for _ in range(m): u, v = map(int, input().split()) g[u].append(v) g[v].append(u) q.append(1) while q: u = q.popleft() for v in g[u]: if d[v] == -1: d[v] = d[u] + 1 q.append(v) for k in range(1, n + 1): print(d[k]) 045 - Easy Graph Problem（★2） 給定一個有 N 個頂點和 M 條邊的連通無向簡單圖。圖的頂點分別被標記為 1 到 N。第 i 條邊連接頂點 a_i 和 b_i（雙向）。\n請你輸出滿足以下條件的頂點的數量：\n恰好存在一個比自身頂點編號小的相鄰頂點。 限制\n2 ≤ N ≤ 100000 N - 1 ≤ M ≤ min(N(N - 1)/2, 100000) 1 ≤ a_i, b_i ≤ N 給定的圖是簡單圖。 給定的圖是連通圖。 輸入的所有值都是整數。 n, m = map(int, input().split()) d = [0] * (n + 1) for _ in range(m): u, v = map(int, input().split()) d[max(u, v)] += 1 print(sum(x == 1 for x in d)) 046 - 幅優先探索 from collections import deque R, C = map(int, input().split()) sx, sy = map(int, input().split()) gx, gy = map(int, input().split()) g = [input() for _ in range(R)] d = [[-1] * C for _ in range(R)] d[sx-1][sy-1] = 0 q = deque() q.append((sx-1, sy-1)) while q: x, y = q.popleft() for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)): nx, ny = x + dx, y + dy if 0 \u0026lt;= nx \u0026lt; R and 0 \u0026lt;= ny \u0026lt; C and g[nx][ny] != \u0026#39;#\u0026#39; and d[nx][ny] == -1: d[nx][ny] = d[x][y] + 1 q.append((nx, ny)) print(d[gx-1][gy-1]) 047 - Bipartite Graph 給定一個有 N 個頂點和 M 條邊的圖。每個頂點都標有從 1 到 N 的數字，第 i 條邊 (1 ≤ i ≤ M) 連接頂點 Aᵢ 和頂點 Bᵢ（雙向）。\n如果這個圖是二部圖，輸出 \u0026ldquo;Yes\u0026rdquo;，如果不是，輸出 \u0026ldquo;No\u0026rdquo;。\nn, m = map(int, input().split()) c = [None] * (n + 1) g = [[] for _ in range(n + 1)] for _ in range(m): u, v = map(int, input().split()) g[u].append(v) g[v].append(u) def dfs(u, color): c[u] = color for v in g[u]: if c[v] is None: if not dfs(v, 1 - color): return False elif c[v] == c[u]: return False return True for i in range(1, n + 1): if c[i] is not None: continue if not dfs(i, 0): print(\u0026#34;No\u0026#34;) break else: print(\u0026#34;Yes\u0026#34;) 048 - Small Multiple 找出 K 的正整數倍數，其十進位表示下各個位數的總和的最小值。\n$$2 ≤ K ≤ 10^5$$\nDijkstra\nimport heapq import math k = int(input()) d = [math.inf] * k q = [(i, i % k) for i in range(1, 10)] heapq.heapify(q) while q: cost, mod = heapq.heappop(q) if d[mod] \u0026lt; cost: continue for i in range(10): new_mod = (mod * 10 + i) % k new_cost = cost + i if new_cost \u0026lt; d[new_mod]: d[new_mod] = new_cost heapq.heappush(q, (new_cost, new_mod)) print(d[0]) SPFA\nfrom collections import deque import math k = int(input()) d = [math.inf] * k q = deque() for i in range(1, 10): d[i % k] = min(d[i % k], i) q.append((i % k, i)) while q: mod, cost = q.popleft() for i in range(10): new_mod = (mod * 10 + i) % k new_cost = cost + i if d[new_mod] \u0026gt; new_cost: d[new_mod] = new_cost q.append((new_mod, new_cost)) print(d[0]) 049 - Fibonacci Easy (mod 1000000007) 給定以下遞迴關係定義的斐波那契數列的第 N 項 a_N，求其對 1000000007 (=10^9+7) 取餘數的結果。\na_1 = 1, a_2 = 1 a_n = a_{n-1} + a_{n-2} (n ≥ 3) 限制：\n3 ≤ N ≤ 10^7 N 為整數 https://en.wikipedia.org/wiki/Fibonacci_sequence#Matrix_form\nimport numpy as np _MOD = 10 ** 9 + 7 _N = 2 _A = np.matrix([[1, 1], [1, 0]], dtype=np.uint64) _B = np.matrix([[1], [0]], dtype=np.uint64) def pow_mod(a, n): res = np.eye(_N, dtype=np.uint64) while n \u0026gt; 0: if n % 2 == 1: res = res * a % _MOD a = a * a % _MOD n //= 2 return res def fib(n): return (pow_mod(_A, n) * _B % _MOD)[1, 0] print(fib(int(input()))) 050 - Power 請計算 a 的 b 次方除以 1000000007 (即 10^9 + 7) 的餘數。\n限制\n1 ≤ a ≤ 100 1 ≤ b ≤ 10^9 所有輸入皆為整數 範例說明\n計算 5^23 除以 10^9+7 的餘數。由於 5^23 = 11920928955078125，所以答案是 871631629。\nprint(pow(*map(int, input().split()), 10 ** 9+7)) 051 - Combination Hard 有一個無限大的格子，每個格子可以用兩個整數 (a, b) 表示。對於所有格子 (a, b)，右邊的格子是 (a+1, b)，上面的格子是 (a, b+1)。\n從格子 (0, 0) 出發，每次只能往上或往右移動到相鄰的格子，有多少種方法可以到達格子 (X, Y)？ 答案需要對 1000000007 （一個質數）取餘。\n條件\n1 ≤ X, Y ≤ 105 所有的輸入都是整數。 _MAXN = 2 * 10 ** 5 + 10 _MOD = 10 ** 9 + 7 fac = [1] * _MAXN inv = [1] * _MAXN for i in range(1, _MAXN): fac[i] = fac[i - 1] * i % _MOD inv[i] = pow(fac[i], -1, _MOD) assert fac[i] * inv[i] % _MOD == 1 x, y = map(int, input().split()) print(fac[x + y] * inv[x] % _MOD * inv[y] % _MOD) 052 - Knight 二維網格上有一枚西洋棋的騎士，位於原點 (0,0)。\n騎士可以從格子 (i,j) 僅移動到格子 (i+1,j+2) 或 (i+2, j+1)。\n有多少種方法可以將騎士移動到格子 (X,Y)？ 請算出答案對 10^9+7 取模的結果。\n限制：\n1 ≤ X ≤ 10^6 1 ≤ Y ≤ 10^6 輸入的所有數值皆為整數。\n_MAXN = 10 ** 6 + 10 _MOD = 10 ** 9 + 7 fac = [1] * _MAXN inv = [1] * _MAXN for i in range(1, _MAXN): fac[i] = fac[i - 1] * i % _MOD inv[-1] = pow(fac[-1], -1, _MOD) for i in range(_MAXN - 2, -1, -1): inv[i] = inv[i + 1] * (i + 1) % _MOD assert fac[i] * inv[i] % _MOD == 1 x, y = map(int, input().split()) ans = 0 for i in range(min(x, y // 2) + 1): rx = x - i j = ry = y - i * 2 if rx != ry * 2: continue ans = (ans + fac[i + j] * inv[i] % _MOD * inv[j]) % _MOD print(ans) 053 - Sum of 4^N 給定一個正整數 N，請輸出 4^0 + 4^1 + \u0026hellip; + 4^N 除以 1,000,000,007 的餘數。\n1 ≤ N ≤ 10^18 $$\\frac{4^{N+1} - 1}{4 - 1}$$\nR = 4 N = int(input()) + 1 _MOD = 10 ** 9 + 7 up = pow(R, N, _MOD) - 1 down = R - 1 print(up * pow(down, -1, _MOD) % _MOD) 054 - Fibonacci Hard (mod 1000000000) 給定一個由以下遞迴關係定義的斐波那契數列的第 N 項 a_N，請輸出其除以 10^9 後的餘數。\na_1 = 1, a_2 = 1 a_n = a_{n-1} + a_{n-2} (n ≥ 3)\nimport numpy as np _MOD = 10 ** 9 _N = 2 _A = np.matrix([[1, 1], [1, 0]], dtype=np.uint64) _B = np.matrix([[1], [0]], dtype=np.uint64) def pow_mod(a, n): res = np.eye(_N, dtype=np.uint64) while n \u0026gt; 0: if n % 2 == 1: res = res * a % _MOD a = a * a % _MOD n //= 2 return res def fib(n): return (pow_mod(_A, n) * _B % _MOD)[1, 0] print(fib(int(input()))) 055 - Recurrence Formula 1 給定一個由以下遞迴關係定義的數列，求數列的第 N 項 a_N 除以 1000000007（=10^9+7）的餘數。\na_1 = 1 a_2 = 1 a_n = 2a_{n－1} + a_{n－2} (n ≥ 3) 限制：\n3 ≤ N ≤ 10^{18} N 是一個整數 $$ \\begin{bmatrix} a_N \\newline a_{N-1} \\end{bmatrix} = \\begin{bmatrix} 2 \u0026amp; 1 \\newline 1 \u0026amp; 0 \\end{bmatrix} \\begin{bmatrix} a_{N-1} \\newline a_{N-2} \\end{bmatrix} $$\n$$ \\begin{bmatrix} a_N \\newline a_{N-1} \\end{bmatrix} = \\begin{bmatrix} 2 \u0026amp; 1 \\newline 1 \u0026amp; 0 \\end{bmatrix}^{N-2} \\begin{bmatrix} a_2 = 1 \\newline a_1 = 1 \\end{bmatrix} $$\nimport numpy as np _MOD = 10 ** 9 + 7 _N = 2 _A = np.matrix([[2, 1], [1, 0]], dtype=np.uint64) _B = np.matrix([[1], [1]], dtype=np.uint64) def pow_mod(a, n): res = np.eye(_N, dtype=np.uint64) while n \u0026gt; 0: if n % 2 == 1: res = res * a % _MOD a = a * a % _MOD n //= 2 return res def f(n): return (pow_mod(_A, n - 2) * _B % _MOD)[0, 0] print(f(int(input()))) 056 - Recurrence Formula 2 請你求出以下遞迴關係定義的數列的第 N 項 a_N 除以 1000000007 (=10^9+7) 的餘數。\na_1 = 1, a_2 = 1, a_3 = 2 a_n = a_{n－1} + a_{n－2} + a_{n-3} (n ≥ 4)\n這個數列 (a_1, a_2, a_3, …) 被稱為三波那契數列。\n限制\n4 ≤ N ≤ 10^{18} N 是一個整數\n$$ \\begin{bmatrix} a_N \\newline a_{N-1} \\newline a_{N-2} \\end{bmatrix} = \\begin{bmatrix} 1 \u0026amp; 1 \u0026amp; 1 \\newline 1 \u0026amp; 0 \u0026amp; 0 \\newline 0 \u0026amp; 1 \u0026amp; 0 \\end{bmatrix} \\begin{bmatrix} a_{N-1} \\newline a_{N-2} \\newline a_{N-3} \\end{bmatrix} \\newline $$\n$$ \\begin{bmatrix} a_N \\newline a_{N-1} \\newline a_{N-2} \\end{bmatrix} = \\begin{bmatrix} 1 \u0026amp; 1 \u0026amp; 1 \\newline 1 \u0026amp; 0 \u0026amp; 0 \\newline 0 \u0026amp; 1 \u0026amp; 0 \\end{bmatrix}^{N-3} \\begin{bmatrix} a_3 = 2 \\newline a_2 = 1 \\newline a_1 = 1 \\end{bmatrix} \\newline $$\nimport numpy as np _MOD = 10 ** 9 + 7 _N = 3 _A = np.matrix([[1, 1, 1], [1, 0, 0], [0, 1, 0]], dtype=np.uint64) _B = np.matrix([[2], [1], [1]], dtype=np.uint64) def pow_mod(a, n): res = np.eye(_N, dtype=np.uint64) while n \u0026gt; 0: if n % 2 == 1: res = res * a % _MOD a = a * a % _MOD n //= 2 return res def f(n): return (pow_mod(_A, n - 3) * _B % _MOD)[0, 0] print(f(int(input()))) 057 - Domino Tiling 給定一個 K × N 的長方形網格，求用 1 × 2 或 2 × 1 的長方形瓷磚完全覆蓋它的方法數，對 1000000007 (=10^9+7) 取模。滿足以下條件的鋪設方式被認為是有效的鋪設方式：\n瓷磚不能超出網格的範圍，並且不同的瓷磚不能重疊。 所有瓷磚都恰好覆蓋網格的 2 個方格。 此外，旋轉或翻轉後一致的鋪設方式也被視為不同的鋪設方式。\n限制：\n2 ≤ K ≤ 4 5 ≤ N ≤ 10^{18} 可能出現如下排列\n1 2 3 4 A A F F B D D H B E E H C C G G 狀態應該設計為前一個Column督多少方塊過來，需要維護的狀態數量就變成了$2^K$個。\nimport numpy as np _MOD = 10 ** 9 + 7 def pow_mod(a, n): res = np.eye(*a.shape, dtype=np.uint64) while n \u0026gt; 0: if n % 2 == 1: res = res @ a % _MOD a = a @ a % _MOD n //= 2 return res k, n = map(int, input().split()) m = 1 \u0026lt;\u0026lt; k a = np.zeros((m, m), dtype=np.uint64) for occupied in range(m): spaces = [j for j in range(k) if (occupied \u0026gt;\u0026gt; j) \u0026amp; 1] for vert in range(1 \u0026lt;\u0026lt; (k - 1)): if (vert \u0026amp; 0b11) == 0b11 or (vert \u0026amp; 0b110) == 0b110: continue vert |= vert \u0026lt;\u0026lt; 1 if vert \u0026amp; occupied: continue next = (m - 1) ^ (vert | occupied) a[occupied][next] += 1 print(pow_mod(a, n)[0, 0]) 058 - Move on Squares 1 在一個無限延伸的棋盤上，放置了一個棋子。你將進行「恰好 N 次移動棋子的操作，每次移動棋子到上下左右相鄰的格子」。\n設棋子最初放置的格子為 (0, 0)。當棋子向右移動 a 格，向上移動 b 格時，其位置為格子 (a, b)。請你判斷，是否可以通過 N 次移動，將棋子最終移動到格子 (X, Y)。\n顯然 $$ N \\geq |X| + |Y| $$\n觀察奇偶性，顯然 $$ N \\equiv |X| + |Y| \\mod 2 $$\nn, x, y = map(int, input().split()) xy = abs(x) + abs(y) ans = n \u0026gt;= xy and n % 2 == xy % 2 print(\u0026#34;Yes\u0026#34; if ans else \u0026#34;No\u0026#34;) 059 - Power of Two 請找出 2 的 N 次方的個位數。\nprint([6, 2, 4, 8][int(input())%4]) 060 - Stones Game 1 有 N 個石頭，兩位玩家輪流拿石頭。每次輪到一位玩家時，他必須拿走至少 1 個，至多 3 個石頭。首先無法拿石頭的玩家輸掉遊戲。給定一個整數 N，判斷在雙方都採取最佳策略的情況下，誰會獲勝。\nn = int(input()) print([\u0026#34;First\u0026#34;, \u0026#34;Second\u0026#34;][n % 4 == 0]) 可以理解為在模4為零的狀態下，無論先手怎麼拿，後手都可以將石頭數量取成模4為零。詳細的數學解析如下：\n$$S(0) = \\text{Lose} \\newline S(1) = \\text{Win} \\newline S(2) = \\text{Win} \\newline S(3) = \\text{Win} \\newline S(N) = \\text{Win} \\iff \\exist {i\\in{1,2,3}}, S(N - i) = \\text{Lose} $$\n061 - Stones Game 2 有 N 個石頭。在每一回合中，假設目前剩餘 a 個石頭，玩家必須拿走至少 1 個，至多 a/2 個石頭 (取整)。第一個無法再拿石頭的玩家輸掉遊戲。請撰寫程式，判斷在雙方都採取最佳策略的情況下，先手玩家和後手玩家誰會獲勝。\n1 ≤ N ≤ 10^18 對於名為 small 的測試案例，額外的限制條件為：1 ≤ N ≤ 10^5 $$S(0) = \\text{Lose} \\newline S(1) = \\text{Lose} \\newline S(2) = \\text{Win} \\newline S(N) = \\text{Win} \\iff \\exist {1 \\leq i \\leq \\lfloor \\frac{N}{2} \\rfloor}, S(N - i) = \\text{Lose} $$\nimport functools @functools.cache def dp(n): if n \u0026lt;= 1: return False return any(not dp(n - i) for i in range(1, n // 2 + 1)) for i in range(100): if not dp(i): print(i) 觀察後可發現先手敗的$N$是：0, 1, 3, 7, 15, 31, 63。 可以大膽假設$N+1$是二的冪次則先手必敗。\nprint([\u0026#39;First\u0026#39;, \u0026#39;Second\u0026#39;][(int(input())+1).bit_count() == 1]) 062 - Teleporter 高橋王國有 N 個城鎮。城鎮編號從 1 到 N。 每個城鎮都設置有一台傳送器。城鎮 i (1 ≤ i ≤ N) 的傳送器傳送目的地是城鎮 A_i。\n高橋王喜歡正整數 K。任性的高橋王想知道，如果從城鎮 1 出發並使用傳送器恰好 K 次，會到達哪個城鎮。\n$2 ≤ N ≤ 2 × 10^5$ $1 ≤ A_i ≤ N$ $1 ≤ K ≤ 10^{18}$\nn, k = map(int, input().split()) d = [[] for _ in range(64)] d[0] = [0] + list(map(int, input().split())) for i in range(63): d[i + 1] = [d[i][d[i][x]] for x in range(n + 1)] p = 1 for i in range(64): if k \u0026amp; (1 \u0026lt;\u0026lt; i): p = d[i][p] print(p) 063 - Move on Squares 2 有一個 $N × N$ 的格狀棋盤。\n從左上角的格子出發，重複地上下左右移動到相鄰的格子，判斷是否存在一條路徑，使得可以回到出發點，並且路徑（除了起點和終點）恰好只經過每個格子一次。\n$2 \\leq N \\leq 10^9$\nprint([\u0026#34;No\u0026#34;, \u0026#34;Yes\u0026#34;][int(input()) % 2 == 0]) 064 - All Zero 給定一個長度為 N 的數列 A = (A₁ , A₂ , \u0026hellip;, Aₙ)。 你需要在數列上執行以下操作恰好 K 次：\n選擇一個介於 1 到 N 之間的整數 x，然後將 Aₓ 增加 1 或減少 1。 判斷是否可以將數列的所有元素都變成零，也就是 (A₁ , A₂ , \u0026hellip;, Aₙ) = (0, 0, \u0026hellip;, 0)。\nn, k = map(int, input().split()) s = sum(abs(x) for x in map(int, input().split())) print([\u0026#34;No\u0026#34;, \u0026#34;Yes\u0026#34;][s % 2 == k % 2 and k \u0026gt;= s]) 065 - Bishop 有一個 H 行、W 列的棋盤。在棋盤的左上角放置了一個角行棋子。\n這個棋子可以重複移動 0 次或更多次，請問可以到達的棋盤格有多少個？ 角行棋子的移動方式是斜向移動。\n更嚴格地說，若棋子從上數第 r₁ 行、左數第 c₁ 列的格子移動到上數第 r₂ 行、左數第 c₂ 列的格子，則需滿足以下條件之一：\nr₁ + c₁ = r₂ + c₂ r₁ - c₁ = r₂ - c₂ 例如，如下圖所示，棋子可以一步移動到紅色的格子。\n限制\n1 ≤ H, W ≤ 10⁹ 所有輸入都是整數。 h, w = map(int, input().split()) if h == 1 or w == 1: print(1) else: print(h * (w // 2) + (h + 1) // 2 * (w % 2)) 066 - Three Cards 有黑色、白色和灰色的卡片各一張。\n求有多少種方法，可以在每張卡片上寫上1到N之間的整數，使得滿足以下至少一個條件：\n黑色卡片和白色卡片上寫的整數的差的絕對值 ≥ K\n黑色卡片和灰色卡片上寫的整數的差的絕對值 ≥ K\n灰色卡片和白色卡片上寫的整數的差的絕對值 ≥ K\n1 ≤ N ≤ 100000\n1 ≤ K ≤ min(5, N - 1)\nn, k = map(int, input().split()) ans = n ** 3 for x in range(n): w = min(k, n - x) ans -= 1 # xxx ans -= (w - 1) * 3 * 2 # xxy, xyy ans -= (w - 1) * (w - 2) * 3 # xyz print(ans) 067 - Cross Sum（★2） 有一個 H 行 W 列的網格。位於第 i 行、第 j 列的格子 (i, j) 上寫著一個整數 A_{i, j}。\n對於所有格子 (i, j) (1 ≤ i ≤ H, 1 ≤ j ≤ W)，請計算以下值：\n將格子 (i, j) 和與其位於同一行或同一列的所有格子上寫的整數加總起來的值。\nn, m = map(int, input().split()) r, c = [0] * n, [0] * m a = [list(map(int, input().split())) for _ in range(n)] for i in range(n): for j, x in enumerate(a[i]): r[i] += x c[j] += x for i in range(n): for j in range(m): print(r[i] + c[j] - a[i][j], end=\u0026#34; \u0026#34;) print() 068 - Number of Multiples 2 給定一個介於1到N之間的整數，請寫一個程式計算有多少個整數是V₁, V₂, \u0026hellip;, Vₖ中至少一個數字的倍數。\n限制：\n1 ≤ N ≤ 10¹² 1 ≤ K ≤ 10 1 ≤ Vᵢ ≤ 50 所有輸入均為整數。\nimport itertools import math n, k = map(int, input().split()) a = list(map(int, input().split())) ans = 0 for i in range(1, k + 1): for s in itertools.combinations(a, i): tmp = n // math.lcm(*s) if i % 2 == 0: ans -= tmp else: ans += tmp print(ans) 069 - Product Max 給定四個整數 a, b, c, d。\n對於滿足 a ≤ x ≤ b 且 c ≤ y ≤ d 的整數 x, y，求 x × y 的最大值。\nimport itertools a, b, c, d = map(int, input().split()) print(max(x * y for x, y in itertools.product((a, b), (c, d)))) 070 - Axis-Parallel Rectangle 在二維座標平面上有 N 個點。第 i 個點的座標是 (x_i, y_i)。\n考慮一個長方形，其內部包含 N 個點中的至少 K 個點，並且長方形的邊與 X 軸或 Y 軸平行。在此情境下，長方形邊上的點也被視為包含在長方形內部。\n請你找出這些長方形中，面積最小的那個長方形的面積。\n限制\n2 ≤ K ≤ N ≤ 50 -10^9 ≤ x_i, y_i ≤ 10^9 (1 ≤ i ≤ N) x_i ≠ x_j (1 ≤ i \u0026lt; j ≤ N) y_i ≠ y_j (1 ≤ i \u0026lt; j ≤ N) 所有輸入值都是整數。 import itertools _INF = 10 ** 20 n, k = map(int, input().split()) points = [tuple(map(int, input().split())) for _ in range(n)] x_axis = sorted(set(x for x, y in points)) ans = _INF for l, r in itertools.combinations(x_axis, 2): ys = [y for x, y in points if l \u0026lt;= x \u0026lt;= r] if len(ys) \u0026lt; k: continue ys.sort() min_k_cover = min(ys[i] - ys[i - k + 1] for i in range(k - 1, len(ys))) ans = min(ans, (r - l) * min_k_cover) print(ans) 071 - Linear Programming 給定一個正整數 N 和 N 組正整數 (a₁, b₁, c₁), (a₂, b₂, c₂), \u0026hellip;, (aN, bN, cN)。\n請編寫一個程序，找出所有滿足以下條件的實數對 (x, y) 中，x + y 的最大值：\na₁x + b₁y ≤ c₁ a₂x + b₂y ≤ c₂ \u0026hellip; aNx + bNy ≤ cN\n1 ≤ N ≤ 500 1 ≤ aᵢ, bᵢ, cᵢ ≤ 10⁹ 當 x + y 達到最大值時，x 和 y 都是正實數。 此限制允許使用 O(N³) 時間複雜度的解法。 直接請Gemini調用Scipy就好了。\nimport scipy.optimize def solve_linear_programming(N, constraints): \u0026#34;\u0026#34;\u0026#34; 使用 scipy.optimize.linprog 解決線性規劃問題。 Args: N: 約束條件的數量。 constraints: 約束條件的列表，每個約束條件都是 (a, b, c) 的元組。 Returns: x + y 的最大值，如果找到解；否則返回 None。 \u0026#34;\u0026#34;\u0026#34; c = [-1, -1] # 目標函數：最大化 x + y A_ub = [] # 不等式約束的係數矩陣 b_ub = [] # 不等式約束的右側向量 for a, b, c_val in constraints: A_ub.append([a, b]) b_ub.append(c_val) bounds = [(0, None), (0, None)] # x 和 y 都是正數 result = scipy.optimize.linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds) if result.success: return -result.fun # 返回 x + y 的最大值 else: return None # 沒有找到解 # 範例輸入 N = int(input()) constraints = [tuple(map(int, input().split())) for _ in range(N)] # 解決問題 max_value = solve_linear_programming(N, constraints) print(max_value) 072 - Max GCD 2 給定兩個整數 A 和 B。請找出在選擇整數 x 和 y，使得 A ≤ x \u0026lt; y ≤ B 時，gcd(x, y) 的最大值。\n$1 ≤ A \u0026lt; B ≤ 2 × 10^5$\na, b = map(int, input().split()) ans = 1 for i in range(1, b - a + 1): y = b // i * i x = y - i if a \u0026lt;= x \u0026lt; y \u0026lt;= b: ans = i print(ans) 073 - Sum of Maximum 有 N 個整數 A_1, A_2, \u0026hellip;, A_N，從中選擇至少一個數的方法有 2^N - 1 種。\n對於每種選擇，計算「所選整數的最大值」。\n求所有這些最大值的總和，並輸出結果對 1000000007 取模後的餘數。\n1 ≤ N ≤ 300000 1 ≤ A_1 \u0026lt; A_2 \u0026lt; \u0026hellip; \u0026lt; A_N ≤ 10^9 _MOD = 10 ** 9 + 7 n = int(input()) a = list(map(int, input().split())) print(sum(pow(2, i, _MOD) * a[i] for i in range(n)) % _MOD) 074 - Sum of difference Easy 有 N 個整數 A_1, A_2, \u0026hellip;, A_N。這裡滿足 A_1 \u0026lt; A_2 \u0026lt; \u0026hellip; \u0026lt; A_N。\n請計算 $\\displaystyle \\sum_{i=1}^{N} \\sum_{j=i+1}^{N} (A_j-A_i)$ 的值。\n2 ≤ N ≤ 200000 1 ≤ A_1 \u0026lt; A_2 \u0026lt; \u0026hellip; \u0026lt; A_N ≤ 10^6 n = int(input()) a = list(map(int, input().split())) s, ans = 0, 0 for i, x in enumerate(a): ans += x * i - s s += x print(ans) 075 - Pyramid 給你一個 N 層的金字塔，最底層由左至右寫著整數 A_1, A_2, \\dots, A_N。\n從底層往上，執行「將相鄰的兩個數相加，答案寫在上一層」的操作。請問，最頂層寫的整數是多少？\n請輸出答案除以 1000000007 (=10^9+7) 的餘數。\n條件：\n2 ≤ N ≤ 200000 1 ≤ A_i ≤ 10^9 所有輸入皆為整數 _MAXN = 200010 _MOD = 10 ** 9 + 7 fac = [1] * _MAXN ifac = [1] * _MAXN for i in range(1, _MAXN): fac[i] = fac[i - 1] * i % _MOD ifac[-1] = pow(fac[-1], -1, _MOD) for i in range(_MAXN - 2, -1, -1): ifac[i] = ifac[i + 1] * (i + 1) % _MOD for i in range(1, _MAXN): assert (fac[i] * ifac[i]) % _MOD == 1 def C(n, m): if n \u0026lt; m: return 0 return fac[n] * ifac[m] % _MOD * ifac[n - m] % _MOD n = int(input()) a = list(map(int, input().split())) ans = 0 for i in range(n): ans = (ans + C(n - 1, i) * a[i]) % _MOD print(ans) 076 - Sum of difference 計算 $$\\displaystyle{\\sum_{i=1}^{N-1}\\sum_{j=i+1}^{N} |A_i-A_j|}$$\nn = int(input()) a = sorted(list(map(int, input().split()))) s, ans = 0, 0 for i, x in enumerate(a): ans += x * i - s s += x print(ans) 077 - Distance Sum 在二維座標平面上，有 N 個點。第 i 個點的座標是 $(X_i, Y_i)$。\n定義 $\\mathcal{dist} (i, j)$ 為第 i 個點和第 j 個點之間的曼哈頓距離。\n曼哈頓距離定義為：座標 $(x_1 , y_1)$ 和座標 $(x_2, y_2)$ 之間的曼哈頓距離是:$$|x_1 − x_2| + |y_1 − y_2|$$\n請編寫一個程序來計算以下公式的值：\n$$\\sum_{i=1}^{N} \\sum_{j=i+1}^{N} \\mathcal{dist} (i,j)$$\n條件\n2 ≤ N ≤ 200000 -10^5 ≤ X_i , Y_i ≤ 10^5 X_i, Y_i 是整數 維度是獨立的，因此本質跟一維解法一樣。\ndef f(a): a.sort() s, ans = 0, 0 for i, x in enumerate(a): ans += x * i - s s += x return ans n = int(input()) p = [tuple(map(int, input().split())) for _ in range(n)] print(f([x[0] for x in p]) + f([x[1] for x in p])) 078 - Difference Optimization 1 ALGO 家有 N 位家庭成員，每個人都有一個從 1 到 N 的編號。已知 1 號成員的年齡是 0 歲，其他人的年齡都是 0 到 120 歲之間的整數。此外，滿足以下 M 個條件：\n成員 A₁ 和成員 B₁ 的年齡差是 0 歲或 1 歲。 成員 A₂ 和成員 B₂ 的年齡差是 0 歲或 1 歲。 \u0026hellip; 成員 Aₘ 和成員 Bₘ 的年齡差是 0 歲或 1 歲。 請輸出每個成員可能的最大年齡。\n條件\n2 ≤ N ≤ 100000 1 ≤ M ≤ 500000 1 ≤ Aᵢ \u0026lt; Bᵢ ≤ N 所有輸入皆為整數 裸BFS。\nfrom collections import deque n, m = map(int, input().split()) g = [[] for _ in range(n + 1)] for _ in range(m): u, v = map(int, input().split()) g[u].append(v) g[v].append(u) d = [120] * (n + 1) d[1] = 0 q = deque([1]) while q: x = q.popleft() for y in g[x]: if d[y] == 120: d[y] = d[x] + 1 q.append(y) for i in range(1, n + 1): print(d[i]) 079 - ModSum 對於一個整數 N，我們選取 ${1, 2, \u0026hellip;, N}$ 的一個排列 ${P_1, P_2, \u0026hellip;, P_N}$。\n然後，對於每個 i=1,2,\u0026hellip;,N，我們計算 i 除以 P_i 的餘數，記為 M_i。\n請你求出 M_1 + M_2 + \u0026hellip; + M_N 的最大值。\n$$\\max_{P} \\sum_{i=1}^N i \\mod P_i$$\nn = int(input()) print(n * (n - 1) // 2) 080 - Difference Optimization 2 給定整數 $x_1, x_2, \\dots, x_N$ 滿足以下所有條件：\n$x_1 = 0$ 對於 $1 \\le i \\le M$ ，滿足 $|x_{A_i} - x_{B_i}| \\le C_i$ 請編寫一個程式，以找出 $x_N$ 的可能最大值。\n限制：\n$2 \\le N \\le 100000$ $0 \\le M \\le 500000$ $1 \\le A_i \u0026lt; B_i \\le N$ $0 \\le C_i \\le 10^9$ 所有輸入皆為整數 如果可以將 $x_N$ 設為任意大的值，輸出 -1。否則，輸出 $x_N$ 的最大值。\nDijkstra\nimport heapq _INF = 10 ** 18 n, m = map(int, input().split()) g = [[] for _ in range(n + 1)] for _ in range(m): u, v, w = map(int, input().split()) g[u].append((v, w)) g[v].append((u, w)) d = [_INF] * (n + 1) d[1] = 0 q = [(d[1], 1)] while q: dist, node = heapq.heappop(q) if dist \u0026gt; d[node]: continue for v, w in g[node]: if d[v] \u0026gt; d[node] + w: d[v] = d[node] + w heapq.heappush(q, (d[v], v)) print(d[n] if d[n] != _INF else -1) 081 - Bill Changing Problem 你用 1000 元、5000 元和 10000 元的紙鈔來支付 N 元。請找出用最少幾張紙鈔就能支付 N 元。\n你可以假設每種面額的紙鈔都有足夠的數量。 1000 ≤ N ≤ 200000 N 是 1000 的倍數 n = int(input()) ans = 0 for x in [10000, 5000, 1000]: ans += n // x n %= x print(ans) 082 - Interval Scheduling Problem 今天有 N 部電影上映。第 i 部電影在時刻 L_i 開始，在時刻 R_i 結束。\n請問最多可以完整看完幾部電影？\n可以看完一部電影後立刻接著看下一部，但不能同時看多部電影。\n限制\n1 ≤ N ≤ 300000 0 ≤ L_i \u0026lt; R_i ≤ 86400 所有輸入皆為整數 子任務\n對於滿足 N ≤ 2000 的測試案例，若答案正確，可獲得 500 分。 n = int(input()) movies = [tuple(map(int, input().split())) for _ in range(n)] movies.sort(key=lambda x: x[1]) end = 0 ans = 0 for l, r in movies: if l \u0026gt;= end: end = r ans += 1 print(ans) 083 - We Used to Sing a Song Together（★3） 問題：\nAGC 街道上有 N 個小學生，小學生 i（1 ≤ i ≤ N）的家位於位置 Aᵢ。 也有 N 所小學，小學 j（1 ≤ j ≤ N）位於位置 Bⱼ。\nAGC 街道上的小學生性格不好，彼此關係惡劣，所以希望所有人都去不同的學校上學。\n不便度定義如下： 設小學生 i 的家到學校的距離為 Eᵢ，則不便度是距離的總和，即 E₁ + E₂ + \u0026hellip; + Eₙ。\n位置 u 到位置 v 的距離為 |u - v|。\n在每個學生都上不同的學校的條件下，求不便度的最小值。\n限制：\n1 ≤ N ≤ 100000 0 ≤ Aᵢ ≤ 10⁹ 0 ≤ Bⱼ ≤ 10⁹ A₁, A₂, \u0026hellip;, Aₙ 彼此不同 B₁, B₂, \u0026hellip;, Bₙ 彼此不同 所有輸入都是整數 n = int(input()) f = lambda : sorted(list(map(int, input().split()))) print(sum(abs(x - y) for x, y in zip(f(), f()))) 084 - Sqrt Inequality $\\sqrt{a} + \\sqrt{b} \u0026lt; \\sqrt{c}$ 嗎？\n1 ≤ a, b, c ≤ 10^9 輸入皆為整數。 $a + b + 2 \\sqrt{ab} \u0026lt; c$ $2 \\sqrt{ab} \u0026lt; c - a - b$\na, b, c = map(int, input().split()) ans = c - a - b \u0026gt;= 0 and 4 * a * b \u0026lt; (c - a - b) ** 2 print([\u0026#34;No\u0026#34;, \u0026#34;Yes\u0026#34;][ans]) 085 - Two Conditions 給定整數 N、X 和 Y，判斷是否存在一組由 1 到 N 之間的整數 (a, b, c, d)，同時滿足以下兩個條件：\na + b + c + d = X a * b * c * d = Y 條件：\n1 ≤ N ≤ 300 1 ≤ X ≤ 109 1 ≤ Y ≤ 109 import itertools n, x, y = map(int, input().split()) s = set() for a, b in itertools.product(range(1, n+1), repeat=2): s.add((a + b, a * b)) if a + b \u0026lt;= x and y % (a * b) == 0: c, d = x - (a + b), y // (a * b) if (c, d) in s: print(\u0026#39;Yes\u0026#39;) break else: print(\u0026#39;No\u0026#39;) 086 - Parentheses Check 給定一個長度為 N 的由 \u0026ldquo;(\u0026rdquo; 和 \u0026ldquo;)\u0026rdquo; 組成的括號序列 S，判斷 S 是否為一個合法的括號序列。\ninput() st = 0 for c in input(): if c == \u0026#39;(\u0026#39;: st += 1 else: st -= 1 if st \u0026lt; 0: print(\u0026#34;No\u0026#34;) break else: print(\u0026#34;Yes\u0026#34; if st == 0 else \u0026#34;No\u0026#34;) 087 - Simple Math Easy 給定一個整數 N。\n$$\\sum_{i=1}^N\\sum_{j=1}^N i\\times j$$\n然後將結果對 1000000007 (=10^9+7) 取餘。\n1 ≤ N ≤ 10^9\nn = int(input()) print((n * (n + 1) // 2) ** 2 % 1000000007) 088 - Simple Math 給定三個正整數 A、B 和 C。\n$$\\sum_{a=1}^A\\sum_{b=1}^B\\sum_{c=1}^C a\\times b\\times c$$\n結果除以 998244353 後的餘數。\n$1 ≤ A, B, C ≤ 10^9$\na, b, c = map(int, input().split()) f = lambda x: x * (x + 1) // 2 print(f(a) * f(b) * f(c) % 998244353) 089 - Log Inequality 2 判斷以下是否成立： $$\\log_2 a \u0026lt; b \\log_2 c$$\n1 ≤ a ≤ 10¹⁸ 1 ≤ b ≤ 10¹⁸ 1 ≤ c ≤ 10¹⁸ import math a, b, c = map(int, input().split()) if b * math.log2(c) \u0026gt;= 64 or a \u0026lt; c ** b: print(\u0026#34;Yes\u0026#34;) else: print(\u0026#34;No\u0026#34;) 090 - Digit Product Equation（★7） 定義函數 f(x) 如下： f(x) = (x 的各個位數數字的乘積) 例如 f(777) = 343，f(8691) = 432，f(869120) = 0。\n給定整數 N 和 B，請找出 1 到 N 之間的整數 m，使得 $m - f(m) = B$ 的 m 的個數。\n$1 ≤ N \u0026lt; 10^{11}$ $1 ≤ B \u0026lt; 10^{11}$\n091 - How Many Ways? 請找出滿足以下所有條件的整數三元組 (a, b, c) 的數量：\n1 ≤ a \u0026lt; b \u0026lt; c ≤ N a + b + c = X $3 \\leq N \\leq 100$ $0 \\leq X \\leq 300$\nimport itertools n, x = map(int, input().split()) print(sum( sum(p) == x for p in itertools.combinations(range(1, n + 1), 3) )) 092 - Beautiful Rectangle 給定一個面積為N的長方形，其長和寬皆為整數。請找出這個長方形的最小周長。\n$1 \\leq N \\leq 10^{12}$\nimport math n = int(input()) ans = n * 2 + 2 for i in range(2, math.isqrt(n) + 1): if n % i == 0: ans = min(ans, 2 * (n // i + i)) print(ans) 093 - Large LCM（★3） 給定兩個正整數 A 和 B。請找出 A 和 B 的最小公倍數。如果答案超過 10^18，則輸出 Large。\n$$ 1 \\leq A, B \\leq 10^{18} $$\nimport math a, b = map(int, input().split()) lcm = math.lcm(a, b) if lcm \u0026gt; 10**18: print(\u0026#34;Large\u0026#34;) else: print(lcm) 094 - Maximal Value 有一個長度為 N 的整數數列 A，其值未知。給定一個長度為 N-1 的整數數列 B。 已知對所有 i， $B_i ≥ \\max(A_i, A_{i+1})$ 都成立。請找出 A 的元素總和可能的最大值。\n$2 \\leq N \\leq 100$ $0 \\leq B_i \\leq 10^5$ $$A_i \\leq \\min(B_i, B_{i-1})$$\n從大到小給值就可以了。\n_INF = 10 ** 9 n = int(input()) b = sorted([(x, i) for i, x in enumerate(map(int, input().split()))], reverse=True) a = [_INF] * n for x, i in b: a[i] = a[i+1] = x print(sum(a)) 095 - Score Sum Queries（★2） ABC 大學有 N 個一年級學生。班級分為 2 個，學號為 i 的學生的班級是 C_i 班。今天期末考試發回來了，學號為 i 的學生的分數是 P_i 分。\n現在有 Q 個查詢，格式如下。 對於每個 j = 1, 2, \u0026hellip;, Q：\n計算學號 L_j ~ R_j 範圍內 1 班學生的期末考試總分。 計算學號 L_j ~ R_j 範圍內 2 班學生的期末考試總分。 分別求出這兩個值。\n限制\n1 ≤ N ≤ 100000 1 ≤ C_i ≤ 2 0 ≤ P_i ≤ 100 1 ≤ Q ≤ 100000 1 ≤ L_j ≤ R_j ≤ N 輸入\n輸入包含所有整數。\n輸出\n輸出格式如下，其中 A_j 是學號 L_j ~ R_j 範圍內 1 班學生的期末考試總分，B_j 是學號 L_j ~ R_j 範圍內 2 班學生的期末考試總分：\nA_1 B_1 A_2 B_2 \u0026hellip; A_Q B_Q\n096 - Cooking 高橋要製作從料理 1 到料理 N 的 N 道料理。\n料理 i 需要使用烤箱連續 T_i 分鐘才能完成。\n一台烤箱不能同時給兩道或以上的料理使用。\n當可以使用兩台烤箱時，製作所有 N 道料理所需的最短時間是多久？ 請注意，可以忽略使用烤箱以外的時間。\n限制\n1 ≤ N ≤ 100 1 ≤ T_i ≤ 10^3 輸入\n輸入皆為整數。 即要把數字分成兩堆，兩堆的和要儘量相同。\nn = int(input()) a = list(map(int, input().split())) s = sum(a) dp = [False] * (s + 1) dp[0] = True ans = s for x in a: for i in range(s, x - 1, -1): dp[i] |= dp[i - x] if dp[i]: ans = min(ans, max(i, s - i)) print(ans) bit流：\nn = int(input()) a = list(map(int, input().split())) s = sum(a) dp = 1 for x in a: dp |= dp \u0026lt;\u0026lt; x ans = s for i in range(s): if (dp \u0026gt;\u0026gt; i) \u0026amp; 1: ans = min(ans, max(i, s - i)) print(ans) 097 - Primes in an Interval 問題：計算在 L 到 R 之間（包含 L 和 R）的素數個數。注意 1 不是素數。\n限制：\n1 ≤ L ≤ R ≤ 10^12 R - L ≤ 500000 _N = 10 ** 6 + 1 is_prime = [True] * _N is_prime[0] = is_prime[1] = False primes = [] for i in range(2, _N): if is_prime[i]: primes.append(i) for j in range(i * i, _N, i): is_prime[j] = False l, r = map(int, input().split()) is_prime_large = [True] * (r - l + 1) if l == 1: is_prime_large[0] = False for p in primes: m = max(2, (l + p - 1) // p) for i in range(m * p, r + 1, p): is_prime_large[i - l] = False print(sum(is_prime_large)) 098 - Polygon and Point 問題敘述\n給定一個有 N 個頂點的多邊形。點 P_i 的坐標為 (X_i, Y_i)，連接 P_i 和 P_{i+1} 的線段 (i = 1, 2, \u0026hellip;, N-1) 是多邊形的邊。另外，連接 P_N 和 P_1 的線段也是多邊形的邊。\n编写一个程序來判斷坐標 (A, B) 是否包含在多邊形的內部。\n限制\n$3 ≤ N ≤ 100000$ $10^9 ≤ X_i ≤ 10^9$ $10^9 ≤ Y_i ≤ 10^9$ $10^9 ≤ A ≤ 10^9$ $10^9 ≤ B ≤ 10^9$ 點 (A, B) 不在多邊形的任何一條邊上。 多邊形的內角不會恰好為 180°。 所有輸入皆為整數。 部分分數\n如果您的程序對於多邊形是凸多邊形的所有情況都正確，則可以獲得 500 分。\n099 - Tree Distance（★5） 給定一個有 N 個節點的樹。樹的節點分別標記為 1 到 N。第 i 條邊連接了節點 a_i 和節點 b_i，且長度都為 1。\n請計算 $\\displaystyle \\sum_{u=1}^{N-1} \\sum_{v=u+1}^{N} dist(u, v)$ 的值。\n其中 dist(u, v) 表示從節點 u 到節點 v 的最短距離。\n2 ≤ N ≤ 100000 1 ≤ a_i, b_i ≤ N 給定的圖是一棵樹。 輸入的所有值都是整數。 即計算每條邊會被走幾次：兩側聯通塊大小乘起來。\nimport sys sys.setrecursionlimit(10 ** 6) n = int(input()) g = [[] for _ in range(n + 1)] for _ in range(n - 1): u, v = map(int, input().split()) g[u].append(v) g[v].append(u) ans = 0 def dfs(u, p): size = 1 for v in g[u]: if v != p: size += dfs(v, u) global ans ans += size * (n - size) return size dfs(1, 0) print(ans) 100 - Simulation of Chemicals 對於 i = 1, 2, \u0026hellip;, Q，請解決以下問題。\n試管中分別有 a, b, c 克的三種物質 A, B, C，在接下來的 1 秒內，會發生以下變化：\n物質 A 中有 aXᵢ 克變成物質 C。 物質 B 中有 bYᵢ 克變成物質 A。 物質 C 中有 cZᵢ 克變成物質 B。 也就是說，1 秒後，物質 A, B, C 的量分別為 a(1-Xᵢ) + bYᵢ, b(1-Yᵢ) + cZᵢ, c(1-Zᵢ) + aXᵢ 克。\n最初，試管中物質 A, B, C 的量分別為 1 克。請編寫程式，求出 Tᵢ 秒後物質 A, B, C 的量。\n限制：\n1 ≤ Q ≤ 10⁴ 0 ≤ Xᵢ, Yᵢ, Zᵢ ≤ 1 1 ≤ Tᵢ ≤ 10⁷ X, Y, Z 為實數，最多到小數點後 7 位。 T 為整數 $$ \\begin{bmatrix} A\u0026rsquo; \\newline B\u0026rsquo; \\newline C\u0026rsquo; \\end{bmatrix} = \\begin{bmatrix} 1-X \u0026amp; Y \u0026amp; 0 \\newline 0 \u0026amp; 1-Y \u0026amp; Z \\newline X \u0026amp; 0 \u0026amp; 1-Z \\end{bmatrix} \\begin{bmatrix} A \\newline B \\newline C \\end{bmatrix} \\newline $$\nimport numpy as np for _ in range(int(input())): qs = input().split() x, y, z = map(float, qs[:3]) t = int(qs[3]) a = np.matrix([[1-x,y,0],[0,1-y,z],[x,0,1-z]]) ans = a**t * np.matrix([[1],[1],[1]]) print(ans[0,0], ans[1,0], ans[2,0]) 101 - Don\u0026rsquo;t be too close（★6） 你有 N 個球，每個球上寫著從 1 到 N 的整數。對於 k = 1, 2, 3, \u0026hellip;, N，回答以下問題：\n從這 N 個球中選擇至少一個球的方法有 2^N - 1 種，其中有多少種選擇滿足以下條件：\n對於任何兩個被選中的球，它們上面寫的整數之差都至少為 k。\n注意：答案可能非常大，所以請輸出答案對 10^9 + 7 取模的結果。\n約束條件：\n1 ≤ N ≤ 10^5 N 是一個整數\n102 - Tricolor Pyramid 有 N 個方塊排成一列，每個方塊塗成藍、白、紅三種顏色之一。\n從這個狀態開始，將方塊堆疊起來，形成一個 N 層的金字塔。\n金字塔的堆疊方式如下：\n每次從底部開始堆疊一個方塊。 如果正下方兩個方塊的顏色相同，則堆疊相同顏色的方塊。 如果正下方兩個方塊的顏色不同，則堆疊與這兩個顏色都不同的方塊。 請問，金字塔最頂端方塊是什麼顏色？\n條件\nN 是一個滿足 2 ≤ N ≤ 400000 的整數。 c_1, c_2, \u0026hellip;, c_N 分別是 B, W, R 之一，分別代表藍色、白色、紅色。 103 - Circle Packing 找到一種方法，在一個中心位於 (0, 0)，半徑為 1 的圓內，鋪設 100 個半徑相等的圓，使得這些圓的半徑盡可能大。這是一個尚未解決的難題，即使在 21 世紀也一直在被挑戰。\n條件：\n對於每一個 i (1 ≤ i ≤ 100)，圓心坐標 (xᵢ, yᵢ) 必須滿足 √((xᵢ)² + (yᵢ)²) \u0026lt; 1。\n如果您的輸出格式與指定的格式不符（包括使用指數表示法），則會被判斷為錯誤（WA）。\n得分取決於圓的半徑 R。\n得分基於 R 的 9 個基準點，得分會根據 R 呈線性增加（折線圖）：\nR = 0.00 時，得分 = 0 R = 0.07 時，得分 = 350 R = 0.08 時，得分 = 750 R = 0.085 時，得分 = 1250 R = 0.088 時，得分 = 1700 R = 0.089 時，得分 = 2000 R = 0.0895 時，得分 = 2700 R = 0.0900 時，得分 = 4000 R = 0.090235 時，得分 = 8700 當 R \u0026gt; 0.090235 時，每增加 10⁻⁹，得分增加 1 分。\n得分將四捨五入為最接近的整數。\n104 - Graph Master 請建構一個滿足所有以下條件的無向無權重圖：\n沒有多重邊或自環。 所有節點的度數都小於等於4。 所有兩個節點之間的最短路徑長度小於等於4。 節點數量越多，分數越高。\n",
    "permalink": "/atcoder/math-algo/",
    "summary": "\u003ch1 id=\"algo-and-math\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm\"\u003eAlgo and Math\u003c/a\u003e\u003c/h1\u003e\n\u003ch2 id=\"001---print-5n\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_a\"\u003e001 - Print 5+N\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(int(input()) \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e5\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"002---sum-of-3-integers\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_b\"\u003e002 - Sum of 3 Integers\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(sum(map(int, input()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esplit())))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"003---sum-of-n-integers\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_c\"\u003e003 - Sum of N Integers\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einput()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(sum(map(int, input()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esplit())))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"004---product-of-3-integers\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_d\"\u003e004 - Product of 3 Integers\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e functools\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e operator\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(functools\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003ereduce(operator\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003emul, map(int, input()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esplit())))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"005---modulo-100\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_e\"\u003e005 - Modulo 100\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einput()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(sum(map(int, input()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esplit())) \u003cspan style=\"color:#f92672\"\u003e%\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e100\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"006---print-2n3\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_f\"\u003e006 - Print 2N+3\u003c/a\u003e\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(int(input()) \u003cspan style=\"color:#f92672\"\u003e*\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#ae81ff\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"007---number-of-multiples-1\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_g\"\u003e007 - Number of Multiples 1\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e在不超過 N 的正整數中，有多少個數是 X 的倍數，或者 Y 的倍數？\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-py\" data-lang=\"py\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f92672\"\u003eimport\u003c/span\u003e math\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003en, x, y \u003cspan style=\"color:#f92672\"\u003e=\u003c/span\u003e map(int, input()\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003esplit())\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(n \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e x \u003cspan style=\"color:#f92672\"\u003e+\u003c/span\u003e n \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e y \u003cspan style=\"color:#f92672\"\u003e-\u003c/span\u003e n \u003cspan style=\"color:#f92672\"\u003e//\u003c/span\u003e math\u003cspan style=\"color:#f92672\"\u003e.\u003c/span\u003elcm(x, y))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"008---brute-force-1\"\u003e\u003ca href=\"https://atcoder.jp/contests/math-and-algorithm/tasks/math_and_algorithm_h\"\u003e008 - Brute Force 1\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003e你有兩張卡片，分別是紅色和藍色，你需要在每張卡片上寫下 1 到 N 之間的整數。有多少種寫法可以讓卡片上數字的總和不超過 S？\u003c/p\u003e"
  },
  {
    "title": "Search",
    "content": "",
    "permalink": "/search/",
    "summary": ""
  }
]
