Yeecy 程式雜筆

隨意寫寫,看懂掌聲 d(`・∀・)b

0%

UVa 10090: Marbles

描述

給定 n 顆彈珠和兩種盒子,且兩種盒子的花費和容量分別為 c1c2n1n2,其中 nc1c2n1n2 都是正整數,現在用數量不定的兩種盒子裝彈珠,並且所有盒子都必須裝滿,若能辦到,問在最低花費下,兩種盒子的所需個數為多少。

思路

pq 分別為兩種盒子所需的數量,則題目可以表述為

(1)argminp,qf(p,q)=c1p+c2q

p,qZ0+ 並同時滿足

(2)n1p+n2q=n

第一層

既然 n 的上限是 20,0000,0000,就不浪費篇幅討論暴力解了,直接進入主題。

第二層

(2) 顯然為二元一次丟番圖方程式,並且容易想到(?)貝祖等式,貝祖等式的內容為

ab 為整數且兩者的最大公因數為 d,則存在整數 xy 使得 ax+by=d

據此有

(3)n1p+n2q=gcd(n1,n2)

觀察式 (2) 和式 (3),兩者的不同在於等號右邊分別為 ngcd(n1,n2),當 ngcd(n1,n2) 的整數倍時,式 (2) 必然會有整數解,即 (p,q)=r(p,q),其中 r 為整數。但是如果 n 不為 gcd(n1,n2) 的整數倍時,式 (2) 會有整數解嗎?答案為否,這是因為 ngcd(n1,n2) 的整數倍是式 (2) 有整數解的必要條件(見證明:命題一),所以找到 gcd(n1,n2) 是當前的首要目標。

利用擴展歐幾里得演算法,可以在求得 gcd(n1,n2) 的同時,得到一組滿足式 (3) 的解,稱其為 (p0,q0)(這又被稱為 (n1,n2) 的一組貝祖係數)。若 n 模除 gcd(n1,n2) 不為 0,表無論 n1n2 怎樣組合都不會得到 n,也就是無解;若為 0,則可以透過將 (p0,q0) 乘上 ngcd(n1,n2) 得到一組滿足式 (2) 的解,稱其為 (p0,q0)

考慮式 (2),知道其法向量為 (n1,n2),根據兩正交向量內積為 0 的性質,可以算出其方向向量可為 (n2,n1),利用方向向量和 (p0,q0) 得到其參數式為

(4){p=p0n2tq=q0+n1t

由於 pq 為非負整數,故 t 的取值範圍並非為全體實數,但也不是整數,為什麼呢?先討論 p,因為 p0 為整數,為使 p 為整數,則 n2t 也得為整數,考慮 n2t 可以形成的最小正整數為 n2gcd(n1,n2),由於 n2 是整數,所以 t 必須是以 gcd(n1,n2) 為分母,任意整數為分子的分數,為方便討論,把分母移給 n2,令 tt 的分子,這樣對任意整數 t,可以得到相應的整數 p,同理,q 也能以 t 表示,改寫式 (4)

(5){p=p0n2gcd(n1,n2)tq=q0+n1gcd(n1,n2)t

把式 (5) 帶入 f(p,q),得到

f(p,q)=c1p+c2q=c1(p0n2gcd(n1,n2)t)+c2(q0+n1gcd(n1,n2)t)(6)=(c1p0+c2q0)+(c1n2+c2n1gcd(n1,n2))t=g(t)

帶入後,原本關於 pq 的函數轉變為關於 t 的函數,同時不難發現 c1p0+c2q0c1n2+c2n1gcd(n1,n2) 都為整數常數,也就是說 g(t) 是線性的,那麼只要知道 t 的上下界並帶入 g(t),就可知道 g(t) 是嚴格遞增或嚴格遞減函數,並得知最小值發生在何處。

現在來推 t 的範圍,考慮 pq 不能為負數,有 p0q0,綜合式 (5)

(7){p=p0n2gcd(n1,n2)t0q=q0+n1gcd(n1,n2)t0

整理式 (7),得到

(8){tp0×gcd(n1,n2)n2tq0×gcd(n1,n2)n1

所以 t 的範圍為 p0×gcd(n1,n2)n2tq0×gcd(n1,n2)n1,若該範圍中不存在任何整數,表無解,否則按前述方法求得 tmin,再把 tmin 帶入式 (5) 回推得出 pminqmin,即為式 (1) 的答案。

範例

1
2
3
1024
24 34
15 20

A. 求 gcd(34,20),得到 gcd(34,20)=2

34÷20=11420÷14=1614÷6=226÷2=30

B. 藉由回推求 gcd(34,20) 的過程得到 (34,20) 的一組貝祖係數 (3,5)

gcd(34,20)=2=142×6=142×(2014)=3×142×20=3×(3420)2×20=3×345×20=3×34+(5)×20

C. 1024 模除 20,繼續。

D. 求 (p0,q0),得 (p0,q0)=10242×(3,5)=(1536,2560)

E. 求 (2560×2)34t1536×220,得 151t153,繼續。

F. 由於 g(151)=729<g(153)=759,取 tmin=151

G. 將 tmin 帶入式 (5),得到答案為 (26,7)

(pmin,qmin)=(1536202×151,2560+342×151)=(26,7)

結論

本題結合了數論與函數的應用,可謂是相當精彩,除非有超強的數學直覺,否則在不知道貝祖定理、擴展歐幾里得演算法或數學推理能力不足的情況下(完全在說我自己),要解出本題是有些難度的。

備註

  • 文中關於貝祖等式的說明翻譯自 Bézout's identity
  • 顯然當 n<n1n<n2 時式 (2) 無法被滿足,可以事先檢查避免多餘的運算,不過不檢查也不會出錯,因為這會在步驟 E. 得到無解。
  • g(t) 不會是水平線,因為題目表明當式 (1) 有解時,可以假設其解唯一。
  • 範例的 A. 和 B. 在擴展歐幾里得演算法中是同時進行的。

證明

命題一:若 n1p+n2q=n 存在整數解,則 ngcd(n1,n2) 的整數倍。

dgcd(n1,n2),因為 n1n2d 的整數倍,不仿設 n1=r1dn2=r2d,其中 r1,r2Z。由於存在整數解使得 n1p+n2q=n 成立,故 (r1d)p+(r2d)q=n 也成立,整理得 n=(r1p+r2q)d,顯然 (r1p+r2q) 為一整數,證畢。

Gitalking ...