這招在解什麼題
競賽裡常出現這種題:兩個正整數未知數、只有一條方程,例如
xy+5x+2y=18
一條方程兩個未知數,看起來「少一條式子、解不開」。但只要它長成「xy 項 + x 的倍數 + y 的倍數」的樣子,就能用 SFFT(Simon's Favorite Factoring Trick) 把它「因式分解成兩個括號的乘積」,再用因數配對把所有整數解列出來。
核心一句話:補一個常數,把 xy+ax+by 配成 (x+b)(y+a)。
為什麼補常數就能配成乘積
把目標的乘積展開看看:
(x+b)(y+a)=xy+ax+by+ab
比對你手上的 xy+ax+by,就差一個 ab。所以兩邊同加 ab,左邊剛好補成完整的乘積:
xy+ax+by+ab=(x+b)(y+a)
這就是 SFFT 的全部祕密 —— 不是背公式,是「湊出乘積展開後缺的那一項」。
標準四步驟
- 整理成 xy+ax+by=c 的形式(x 的係數是 a、y 的係數是 b)。
- 兩邊同加 ab,左邊配成 (x+b)(y+a),右邊變成 c+ab。
- 對右邊 c+ab 做因數分解,列出所有因數對 (d1,d2),令 x+b=d1、y+a=d2。
- 回推每組 (x,y),並檢查題目的範圍限制(正整數?非負?某區間?)再取捨。
以 xy+5x+2y=18 為例:a=5、b=2,補 ab=10:
(x+2)(y+5)=28
把 28 拆成因數對,配上 x+2≥3、y+5≥6(因為 x,y 是正整數)的限制,就能把符合的 (x,y) 全部找齊。
定義域決定你留哪些因數對:上面的下界 x+2≥3、y+5≥6 是「正整數」才成立。若題目改成非負整數(x,y≥0)下界會變成 x+2≥2、y+5≥5;若是任意整數,還得考慮負因數對。動手拆因數前,先看清楚題目要的是哪種整數。
和韋達定理的關係
SFFT 是「把和/積湊回乘積」;韋達定理則是「已知乘積的根,反讀和與積」。兩者都在處理同一件事的兩面:
- 首項係數為 1 的一元二次 t2−(α+β)t+αβ=0,兩根 α,β 滿足和 =α+β、積 =αβ。(一般式 At2+Bt+C=0 則是和 =−B/A、積 =C/A,別忘了除以首項係數。)
- 高次多項式做因式分解(如 x4−6x3+13x2−12x+4)時,也是在找「哪些乘積湊得出這些係數」。
所以「求整數解」與「多項式因式分解 / 求根」在競賽裡常是同一組工具的不同外衣 —— 把加減的式子想辦法變成乘積,再讀因數/根。
常見陷阱(很多人在這裡掉分)
- 漏掉負因數:c+ab 的因數對包含負負得正的組合。若題目允許 x,y 為負或 0(或 c+ab<0、=0),漏掉負因數/零就會漏解。
- 忘記回代 + 檢查:因數配對給的是 x+b、y+a 的值,要減回去得 x=d1−b、y=d2−a,再逐組回頭檢查是否真的滿足題目條件(正整數就要驗 x>0,y>0),不是每個因數對都算數。
- ab 的正負:補的常數是 ab,帶正負號 —— 若 a 或 b 為負,ab 可能是負數,不是永遠「加一個正數」。
- 係數對應搞反:(x+b)(y+a) 裡,補在 x 上的是 y 的係數 b、補在 y 上的是 x 的係數 a(交叉的),寫反會全錯。
- 右邊忘記加 ab:只配左邊、右邊沒同步加 ab,等式就不成立了。
學完動手
觀念看懂只是第一步,SFFT 要靠「多配幾題」才會變成反射動作。到練習題庫做本知識點的原創分層練習,每題附完整繁中詳解。