與最小公倍數(shù)實(shí)戰(zhàn)精解)
1. 項(xiàng)目概述從基礎(chǔ)數(shù)學(xué)到算法競賽的橋梁如果你正在準(zhǔn)備藍(lán)橋杯這類算法競賽或者在學(xué)習(xí)C/C編程的路上那么“最大公約數(shù)”和“最小公倍數(shù)”這兩個(gè)概念你一定繞不過去。它們看起來是小學(xué)數(shù)學(xué)的內(nèi)容但在算法世界里卻是構(gòu)建更復(fù)雜解決方案的基石。我剛開始接觸算法題時(shí)也覺得這太簡單了直到在羅勇軍老師的《藍(lán)橋杯算法入門C/C》里做了專題練習(xí)才發(fā)現(xiàn)里面門道不少。從簡單的兩數(shù)計(jì)算到多個(gè)數(shù)的處理再到如何巧妙地應(yīng)用它們解決實(shí)際問題比如時(shí)鐘同步、分?jǐn)?shù)化簡、資源分配等每一步都藏著優(yōu)化效率和代碼健壯性的細(xì)節(jié)。這個(gè)專題練習(xí)的核心就是幫你把數(shù)學(xué)知識(shí)扎實(shí)地轉(zhuǎn)化成可落地、高效率的C/C代碼能力讓你在競賽和實(shí)際開發(fā)中遇到相關(guān)問題時(shí)能信手拈來。2. 核心概念與算法原理深度解析2.1 最大公約數(shù)不止于“輾轉(zhuǎn)相除”最大公約數(shù)Greatest Common Divisor簡稱GCD。它的定義很直觀能同時(shí)整除一組整數(shù)的最大正整數(shù)。但在編程實(shí)現(xiàn)時(shí)我們追求的是效率和正確性。最經(jīng)典的算法是歐幾里得算法也叫輾轉(zhuǎn)相除法。其原理基于一個(gè)核心定理gcd(a, b) gcd(b, a % b)。當(dāng)余數(shù)a % b為0時(shí)此時(shí)的b就是最大公約數(shù)。這個(gè)算法的美妙之處在于它用取模運(yùn)算快速縮小問題規(guī)模。注意這里有一個(gè)初學(xué)者極易忽略的細(xì)節(jié)。在C/C中%運(yùn)算符對負(fù)數(shù)的處理結(jié)果是依賴于編譯器的C99/C11標(biāo)準(zhǔn)規(guī)定商向零取整。因此為了保證我們的gcd函數(shù)對任意整數(shù)包括負(fù)數(shù)都能正確工作一個(gè)健壯的實(shí)現(xiàn)應(yīng)該在函數(shù)內(nèi)部對參數(shù)取絕對值或者確保在循環(huán)前處理符號(hào)。更常見的做法是在調(diào)用gcd前確保傳入的是正整數(shù)或者在算法內(nèi)部使用gcd(abs(a), abs(b))。除了基礎(chǔ)的輾轉(zhuǎn)相除法還有一種更高效的二進(jìn)制算法Stein算法它通過位移和減法來避免耗時(shí)的取模運(yùn)算特別適合在沒有硬件除法指令的嵌入式環(huán)境或處理大整數(shù)時(shí)使用。其核心思想是利用以下性質(zhì)若a和b都是偶數(shù)gcd(a, b) 2 * gcd(a/2, b/2)若a是偶數(shù)b是奇數(shù)gcd(a, b) gcd(a/2, b)若a和b都是奇數(shù)gcd(a, b) gcd(|a-b|, min(a, b))雖然藍(lán)橋杯入門階段掌握輾轉(zhuǎn)相除法已足夠但了解Stein算法能拓寬你的思路。2.2 最小公倍數(shù)與GCD的黃金搭檔最小公倍數(shù)Least Common Multiple簡稱LCM。對于兩個(gè)正整數(shù)a和b有一個(gè)極其重要的公式將它們與GCD聯(lián)系起來lcm(a, b) a * b / gcd(a, b)。這個(gè)公式是求解LCM的基石它避免了暴力枚舉從max(a,b)開始逐個(gè)嘗試將時(shí)間復(fù)雜度從O(n)降低到與GCD計(jì)算同階的O(log(min(a, b)))。理解這個(gè)公式的推導(dǎo)很重要兩個(gè)數(shù)的乘積等于它們的最大公約數(shù)與最小公倍數(shù)的乘積。即a * b gcd(a, b) * lcm(a, b)。這從整數(shù)的質(zhì)因數(shù)分解角度很容易理解GCD取質(zhì)因數(shù)冪次的最小值LCM取最大值兩者相乘正好還原為原始質(zhì)因數(shù)冪次之和。實(shí)操心得直接使用公式a * b / gcd(a, b)有一個(gè)巨大的“坑”——溢出。如果a和b都是接近10^9的量級(jí)它們的乘積就會(huì)超過32位整型int的范圍約21億導(dǎo)致計(jì)算結(jié)果錯(cuò)誤。這是算法題中非常常見的陷阱。正確的做法是先除后乘。即lcm a / gcd(a, b) * b。因?yàn)間cd(a, b)一定能整除a所以先進(jìn)行除法運(yùn)算是安全的整數(shù)運(yùn)算能有效避免中間結(jié)果的溢出。這個(gè)小技巧是寫出魯棒性代碼的關(guān)鍵。3. 從兩個(gè)數(shù)到多個(gè)數(shù)的計(jì)算策略實(shí)際問題中我們往往需要處理三個(gè)甚至更多數(shù)的GCD和LCM。羅勇軍老師的專題練習(xí)里這部分是重點(diǎn)提升內(nèi)容。3.1 多數(shù)的最大公約數(shù)計(jì)算計(jì)算多個(gè)數(shù)例如a, b, c, d的最大公約數(shù)核心思想是迭代或遞歸應(yīng)用兩數(shù)的GCD函數(shù)。因?yàn)樽畲蠊s數(shù)運(yùn)算滿足結(jié)合律gcd(a, b, c) gcd(gcd(a, b), c)。我們可以很容易地將其擴(kuò)展到一個(gè)數(shù)組int gcd_multi(int arr[], int n) { // n為數(shù)組元素個(gè)數(shù) int result arr[0]; for (int i 1; i n; i) { result gcd(result, arr[i]); // 一個(gè)小優(yōu)化如果中途result已經(jīng)變成1那么1就是所有數(shù)的GCD可以直接返回 if(result 1) { return 1; } } return result; }這種方法的正確性顯而易見且時(shí)間復(fù)雜度是O(n * log(min_value))效率很高。3.2 多數(shù)的最小公倍數(shù)計(jì)算類似地多個(gè)數(shù)的最小公倍數(shù)也可以通過迭代兩數(shù)LCM公式來計(jì)算lcm(a, b, c) lcm(lcm(a, b), c)。其代碼實(shí)現(xiàn)如下int lcm_multi(int arr[], int n) { int result arr[0]; for (int i 1; i n; i) { // 切記使用先除后乘的防溢出寫法 result result / gcd(result, arr[i]) * arr[i]; } return result; }這里有一個(gè)非常重要的注意事項(xiàng)計(jì)算多數(shù)LCM時(shí)雖然數(shù)學(xué)上lcm(a, b, c) lcm(lcm(a, b), c)成立但我們必須意識(shí)到隨著迭代進(jìn)行中間結(jié)果result可能會(huì)增長得非??焐踔脸^64位整型long long的范圍。例如計(jì)算100以內(nèi)所有質(zhì)數(shù)的LCM結(jié)果將是一個(gè)天文數(shù)字。因此在競賽或?qū)嶋H應(yīng)用中如果題目沒有說明結(jié)果一定在某個(gè)范圍內(nèi)或者數(shù)字可能很大就需要考慮使用高精度運(yùn)算或者轉(zhuǎn)換解題思路例如只需求解模某個(gè)數(shù)后的結(jié)果。4. 專題練習(xí)實(shí)戰(zhàn)與代碼實(shí)現(xiàn)詳解光說不練假把式我們結(jié)合《藍(lán)橋杯算法入門C/C》中的典型練習(xí)題來拆解完整的實(shí)現(xiàn)過程和優(yōu)化技巧。4.1 基礎(chǔ)模板健壯的GCD與LCM函數(shù)首先寫出一個(gè)工業(yè)級(jí)強(qiáng)度的基礎(chǔ)工具函數(shù)集。這是你解決所有相關(guān)問題的基礎(chǔ)。#include iostream #include cmath // 用于abs函數(shù) using namespace std; // 使用輾轉(zhuǎn)相除法計(jì)算最大公約數(shù)迭代版本推薦效率高 int gcd(int a, int b) { // 確保在循環(huán)中b不為0同時(shí)處理負(fù)數(shù) a abs(a); b abs(b); while (b ! 0) { int temp a % b; a b; b temp; } return a; // 當(dāng)b為0時(shí)a即為最大公約數(shù) } // 遞歸版本代碼更簡潔但遞歸有棧開銷 int gcd_recursive(int a, int b) { if (b 0) return a; return gcd_recursive(b, a % b); } // 計(jì)算最小公倍數(shù)嚴(yán)防溢出 long long lcm(int a, int b) { // 使用long long接收結(jié)果并采用先除后乘 return (long long)a / gcd(a, b) * b; } int main() { // 測試基礎(chǔ)功能 cout gcd(48, 18) gcd(48, 18) endl; // 輸出 6 cout gcd(-48, 18) gcd(-48, 18) endl; // 輸出 6 cout lcm(12, 18) lcm(12, 18) endl; // 輸出 36 // 測試大數(shù)防溢出 int a 1234567890, b 987654321; cout lcm( a , b ) lcm(a, b) endl; // 正確計(jì)算若用a*b/gcd則會(huì)溢出 return 0; }4.2 經(jīng)典例題解析三個(gè)數(shù)的GCD與LCM這是入門練習(xí)中非常經(jīng)典的一題要求從輸入中讀取三個(gè)正整數(shù)輸出它們的GCD和LCM。解題思路讀入三個(gè)整數(shù)。調(diào)用gcd(gcd(a, b), c)得到最大公約數(shù)。調(diào)用lcm(lcm(a, b), c)得到最小公倍數(shù)。注意使用防溢出的lcm函數(shù)。完整代碼實(shí)現(xiàn)#include iostream using namespace std; int gcd(int a, int b) { while (b) { int t a % b; a b; b t; } return a; } long long lcm(int a, int b) { return (long long)a / gcd(a, b) * b; } int main() { int a, b, c; cin a b c; int gcd_ab gcd(a, b); int gcd_abc gcd(gcd_ab, c); long long lcm_ab lcm(a, b); long long lcm_abc lcm(lcm_ab, c); cout gcd_abc endl; cout lcm_abc endl; return 0; }代碼要點(diǎn)分析變量類型lcm_ab和lcm_abc使用了long long類型這是因?yàn)閮蓚€(gè)int的LCM可能超出int范圍。這是一種防御性編程。計(jì)算順序先計(jì)算兩兩的GCD和LCM再與第三個(gè)數(shù)結(jié)合。邏輯清晰易于理解和調(diào)試。輸入輸出直接使用cin和cout符合藍(lán)橋杯等競賽的常見IO風(fēng)格。4.3 進(jìn)階應(yīng)用分?jǐn)?shù)化簡與時(shí)鐘問題GCD和LCM的應(yīng)用場景遠(yuǎn)不止單純的計(jì)算。我們來看兩個(gè)典型的應(yīng)用。應(yīng)用一分?jǐn)?shù)化簡題目輸入兩個(gè)正整數(shù)分別作為分子和分母輸出其最簡分?jǐn)?shù)形式。void simplify_fraction(int numerator, int denominator) { int common_divisor gcd(numerator, denominator); numerator / common_divisor; denominator / common_divisor; } // 調(diào)用后numerator和denominator就是互質(zhì)的最簡形式。這里直接利用GCD找到分子分母的最大公因數(shù)然后約去。這是GCD最直接的應(yīng)用之一。應(yīng)用二時(shí)鐘校準(zhǔn)模擬“網(wǎng)絡(luò)熱詞時(shí)鐘校準(zhǔn) 各協(xié)議周期的最小公倍數(shù)作為統(tǒng)一基準(zhǔn)周期”這是一個(gè)非常貼近實(shí)際的應(yīng)用場景。假設(shè)我們有三個(gè)周期性任務(wù)周期分別為A秒、B秒、C秒。它們從0時(shí)刻同時(shí)開始請問下一次它們再次同時(shí)開始的時(shí)刻是多少這其實(shí)就是求A, B, C的最小公倍數(shù)。// 假設(shè)周期單位為秒且周期值不是特別大結(jié)果在long long范圍內(nèi) long long find_common_start_time(int periodA, int periodB, int periodC) { return lcm(lcm(periodA, periodB), periodC); } int main() { int p1 12, p2 18, p3 24; // 三個(gè)任務(wù)的周期 long long next_sync find_common_start_time(p1, p2, p3); cout 下一次同時(shí)開始的時(shí)刻是第 next_sync 秒。 endl; // 輸出下一次同時(shí)開始的時(shí)刻是第 72 秒。 return 0; }這個(gè)模型可以擴(kuò)展到網(wǎng)絡(luò)協(xié)議同步、多齒輪轉(zhuǎn)動(dòng)、行星會(huì)合等眾多問題。理解LCM是解決這類“重逢周期”問題的鑰匙。5. 藍(lán)橋杯真題思路與高頻考點(diǎn)剖析結(jié)合羅勇軍老師的教材和歷年真題GCD和LCM的考察 rarely 是孤立的它們常常作為解題的一個(gè)關(guān)鍵步驟嵌入到更復(fù)雜的問題中。5.1 真題風(fēng)格與常見套路直接計(jì)算題如同上面的例題直接要求計(jì)算多個(gè)數(shù)的GCD或LCM。這類題是送分題但務(wù)必注意數(shù)據(jù)范圍和溢出問題。如果題目中數(shù)字可能很大比如10^9一定要用long long和先除后乘的技巧。數(shù)學(xué)思維題需要你發(fā)現(xiàn)題目背后的數(shù)學(xué)模型就是GCD或LCM。等分問題將一根長為L的繩子剪成等長的小段每段長是a的倍數(shù)也是b的倍數(shù)求最長段長。這實(shí)際上是求a和b的最大公約數(shù)。因?yàn)榈确忠蠖伍L能整除L且是a和b的公因數(shù)求最長就是求最大公因數(shù)。相遇問題甲、乙、丙沿環(huán)形跑道跑步速度不同求下一次在起點(diǎn)相遇的時(shí)間。這需要求他們各自跑一圈所需時(shí)間的最小公倍數(shù)。矩形分割用若干a×b的小矩形拼成一個(gè)大矩形求大矩形的最小面積。這往往轉(zhuǎn)化為求a和b的最小公倍數(shù)來構(gòu)造邊長。算法組成部分在更復(fù)雜的算法中GCD函數(shù)可能被頻繁調(diào)用。例如在計(jì)算斜率是否相等判斷三點(diǎn)共線時(shí)通常會(huì)將分?jǐn)?shù)形式的斜率(y2-y1)/(x2-x1)化簡為最簡整數(shù)比(dx/g, dy/g)其中g(shù) gcd(dx, dy)以避免浮點(diǎn)數(shù)精度問題和便于比較。5.2 一道綜合真題模擬分析假設(shè)有這樣一道題“小藍(lán)有N根長度不同的木棍。他想從中選出三根嘗試拼成一個(gè)直角三角形。為了增加成功率他希望選出的三根木棍長度的最大公約數(shù)盡可能大。請幫他找出這個(gè)最大的最大公約數(shù)。”解題思路拆解問題轉(zhuǎn)化這不是一個(gè)簡單的求所有數(shù)GCD的問題。我們需要從N個(gè)數(shù)中找一個(gè)三元組(a, b, c)滿足勾股定理a^2 b^2 c^2然后求這個(gè)三元組的GCD并最大化它。關(guān)鍵洞察如果三元組(a, b, c)是勾股數(shù)且它們的最大公約數(shù)是g那么(a/g, b/g, c/g)必然是一個(gè)本原勾股數(shù)即三者互質(zhì)。反之任何一個(gè)本原勾股數(shù)乘以同一個(gè)系數(shù)g就能得到所有勾股數(shù)。算法設(shè)計(jì)預(yù)處理枚舉所有可能的木棍長度三元組驗(yàn)證是否構(gòu)成勾股數(shù)。數(shù)據(jù)量大的話需要優(yōu)化比如先排序固定最大邊c用雙指針找a和b。對于每個(gè)滿足條件的勾股三元組計(jì)算三者的GCD記為g。維護(hù)一個(gè)全局變量max_gcd記錄最大的g。最終答案就是max_gcd。GCD在其中的作用它是將任意勾股數(shù)規(guī)約到本原勾股數(shù)的工具也是我們最終要優(yōu)化的目標(biāo)值。這道題巧妙地將數(shù)論GCD和幾何勾股定理結(jié)合在一起。通過這道模擬題你可以看到GCD的知識(shí)點(diǎn)是如何被“包裝”在一個(gè)看似是幾何或組合問題里的。備戰(zhàn)藍(lán)橋杯就需要訓(xùn)練這種將具體問題抽象成數(shù)學(xué)模型的能力。6. 常見陷阱、調(diào)試技巧與性能優(yōu)化6.1 十大常見錯(cuò)誤與排查表錯(cuò)誤現(xiàn)象可能原因解決方案計(jì)算LCM時(shí)結(jié)果錯(cuò)誤或?yàn)樨?fù)數(shù)使用a * b / gcd(a, b)導(dǎo)致乘法溢出改為a / gcd(a, b) * b輸入負(fù)數(shù)時(shí)GCD計(jì)算錯(cuò)誤%運(yùn)算符對負(fù)數(shù)的行為未處理在GCD函數(shù)入口使用abs()取絕對值多數(shù)字LCM計(jì)算結(jié)果異常大或溢出迭代計(jì)算時(shí)中間值增長過快超出數(shù)據(jù)類型范圍檢查題目數(shù)據(jù)范圍考慮使用高精度庫如C的boost::multiprecision或求模LCM遞歸計(jì)算GCD導(dǎo)致棧溢出數(shù)字過大或遞歸深度太深改用迭代版本的輾轉(zhuǎn)相除法代碼對輸入0處理不當(dāng)計(jì)算lcm(a, 0)會(huì)導(dǎo)致除零錯(cuò)誤特殊處理定義lcm(a, 0) 0但需根據(jù)題目邏輯判斷合理性使用sqrt等浮點(diǎn)函數(shù)參與整數(shù)運(yùn)算引入精度誤差導(dǎo)致比較錯(cuò)誤整數(shù)問題盡量避免浮點(diǎn)數(shù)使用整數(shù)平方或二分查找誤以為gcd(a, b) * lcm(a, b) a * b總是成立當(dāng)a和b很大時(shí)等式右邊可能已溢出理解公式的數(shù)學(xué)本質(zhì)編碼時(shí)注意運(yùn)算順序循環(huán)求多數(shù)GCD時(shí)未做提前終止優(yōu)化當(dāng)中間結(jié)果已為1時(shí)繼續(xù)循環(huán)在循環(huán)中加入if(result 1) break;混淆“公約數(shù)”和“公倍數(shù)”的概念在解決問題時(shí)套錯(cuò)公式畫圖或舉例驗(yàn)證思路明確題目求的是“最大”的公約數(shù)還是“最小”的公倍數(shù)忽略輸入數(shù)據(jù)的多組測試用例格式只處理了一組數(shù)據(jù)導(dǎo)致WA使用while(cin a b)或while(scanf(...) ! EOF)循環(huán)讀取6.2 調(diào)試與測試技巧邊界測試務(wù)必測試以下情況輸入包含0、1。輸入包含負(fù)數(shù)如果題目允許。兩個(gè)數(shù)相等。兩個(gè)數(shù)互質(zhì)如17和31。一個(gè)數(shù)是另一個(gè)數(shù)的倍數(shù)如12和48。非常大的質(zhì)數(shù)如999983。數(shù)據(jù)范圍邊界值如int最大值2147483647。使用小數(shù)據(jù)驗(yàn)證對于復(fù)雜問題先用手算可以的小數(shù)據(jù)驗(yàn)證算法邏輯是否正確。比如求gcd(12, 18, 24)和lcm(12, 18, 24)口算是6和72。中間變量打印在懷疑出錯(cuò)的地方打印出關(guān)鍵中間變量的值。例如在迭代求多數(shù)LCM時(shí)打印每一步的result值觀察其增長是否符合預(yù)期。對拍寫一個(gè)暴力但正確的算法比如枚舉法求GCD/LCM僅用于小數(shù)據(jù)與你優(yōu)化的算法進(jìn)行大量隨機(jī)數(shù)據(jù)對比確保結(jié)果一致。這是競賽中驗(yàn)證算法正確性的黃金手段。6.3 性能優(yōu)化建議對于藍(lán)橋杯這種有時(shí)間限制的競賽效率很重要。使用迭代而非遞歸遞歸版本的GCD雖然簡潔但存在函數(shù)調(diào)用開銷和??臻g消耗。迭代版本幾乎總是更優(yōu)。內(nèi)聯(lián)小函數(shù)對于像gcd這樣短小且頻繁調(diào)用的函數(shù)可以在函數(shù)前加inline關(guān)鍵字建議編譯器內(nèi)聯(lián)展開減少調(diào)用開銷。inline int gcd(int a, int b) { ... }使用更快的IO當(dāng)需要讀入大量數(shù)據(jù)如10^5組時(shí)cin/cout可能成為瓶頸??梢躁P(guān)閉同步流或使用C語言的scanf/printf。ios::sync_with_stdio(false); cin.tie(nullptr);預(yù)處理GCD表如果題目需要反復(fù)查詢固定范圍內(nèi)大量數(shù)字對的GCD可以考慮預(yù)處理一個(gè)二維GCD表用空間換時(shí)間。但這通常適用于范圍較小如幾千的情況。利用性質(zhì)提前退出在循環(huán)計(jì)算數(shù)組的GCD時(shí)一旦中間結(jié)果變?yōu)?就可以立即返回1因?yàn)?是所有正整數(shù)的公約數(shù)。7. 擴(kuò)展學(xué)習(xí)與資源推薦掌握了GCD和LCM的基礎(chǔ)和競賽應(yīng)用后你可以向更深、更廣的領(lǐng)域探索。擴(kuò)展歐幾里得算法這是輾轉(zhuǎn)相除法的超級(jí)升級(jí)版。它不僅能求出gcd(a, b)還能找到一組整數(shù)x, y使得a*x b*y gcd(a, b)。這個(gè)方程被稱為貝祖等式。它在求解模線性方程、乘法逆元RSA算法基礎(chǔ)等問題中至關(guān)重要是數(shù)論和密碼學(xué)的核心工具之一。算術(shù)基本定理與質(zhì)因數(shù)分解法任何大于1的整數(shù)都可以唯一分解為質(zhì)數(shù)的乘積。從這個(gè)角度看GCD就是取各質(zhì)因數(shù)冪次的最小值LCM是取最大值。雖然分解質(zhì)因數(shù)的方法在求GCD/LCM時(shí)效率不如輾轉(zhuǎn)相除法但這種思想在解決與因子、倍數(shù)相關(guān)的問題時(shí)非常強(qiáng)大。與斐波那契數(shù)列的有趣關(guān)聯(lián)有一個(gè)著名的定理gcd(Fib(m), Fib(n)) Fib(gcd(m, n))其中Fib(k)是第k個(gè)斐波那契數(shù)。這展示了數(shù)論中不同概念之間美妙的聯(lián)系。實(shí)戰(zhàn)資源推薦刷題平臺(tái)在洛谷、力扣、Codeforces等平臺(tái)上搜索“GCD”、“LCM”相關(guān)標(biāo)簽的題目從簡單到困難進(jìn)行系統(tǒng)練習(xí)。羅勇軍老師相關(guān)著作除了《藍(lán)橋杯算法入門C/C》還可以關(guān)注他的博客和后續(xù)出版的針對省賽、國賽的教程其中會(huì)有更多綜合性的例題講解?!端惴ǜ傎惾腴T經(jīng)典》劉汝佳的這本書是算法競賽的經(jīng)典教材其數(shù)論章節(jié)對GCD、LCM及其應(yīng)用有更深入的討論?;剡^頭看GCD和LCM專題就像算法世界里的“扎馬步”看似簡單枯燥但練好了下盤才穩(wěn)。我自己的體會(huì)是最初只是死記硬背輾轉(zhuǎn)相除法的代碼后來在反復(fù)做題和踩坑中才真正理解了溢出處理、負(fù)數(shù)處理這些細(xì)節(jié)的重要性也學(xué)會(huì)了如何把它們作為工具去拆解更復(fù)雜的問題。下次當(dāng)你遇到涉及“周期”、“同時(shí)”、“等分”、“最簡”這些關(guān)鍵詞的題目時(shí)不妨先想想是不是又能請出GCD和LCM這兩位老朋友來幫忙了。