問題
灌水問題的經典形式是這樣的:
“假設有一個池塘,裏麵有無窮多的水。現有2個空水壺,容積分別為5升和6升。問題是如何隻用這2個水壺從池塘裏取得3升的水。”
當然題外是有一些合理的限製的,比如從池塘裏灌水的時候,不管壺裏是不是已經有水了,壺一定要灌滿,不能和另一個壺裏的水位比照一下“毛估估”(我們可以假設壺是不透明的,而且形狀也不同);同樣的,如果要把水從壺裏倒進池塘裏,一定要都倒光;如果要把水從一個壺裏倒進另一個壺裏,也要都倒光,除非在倒的過程中另一個壺已經滿了;倒水的時候水沒有損失(蒸發溢出什麼的)等等。
解答方式
要解決上麵這題,你隻要用兩個壺中的其中一個從池塘裏灌水,不斷地倒到另一個壺裏,當第二個壺滿了的時候,把其中的水倒回池塘裏,反複幾次,就得到答案了。以5升壺(A)灌6升壺(B)為例:AB0050A→B0555A→B4640A→B0454A→B36。
現在我們問,如果是多於2隻壺的情況怎麼辦(這樣一來就不能用上麵的循環倒水法了)?如何在倒水之前就知道靠這些壺是一定能(或一定不能)倒出若幹升水來的?試舉數例:(1)兩個壺:65升和78升,倒38升和39升。
(2)三個壺:6升,10升和45升,倒31升。
我們可以看到,在(1)中,65=5×13,78=6×13,而39=3×13。所以如果把13升水看作一個單位的話(原題中的“升”是沒有什麼重要意義的,你可以把它換成任何容積單位,毫升,加侖——或者“13升”),這題和最初的題目是一樣的。而38升呢?顯然是不可能的,它不是13的倍數,而65升和78升的壺怎麼也隻能倒出13升的倍數來。也可以這樣理解:這相當於在原題中要求用5升和6升的壺倒出38/39升來。
那麼(2)呢?你會發現,隻用任何其中兩個壺是倒不出31升水的,理由就是上麵所說的,(6,10)=2,(6,45)=3,(10,45)=5,(這裏(a,b)是a和b的最大公約數),而2,3,5均不整除31。可是用三個壺就可以倒出31升:用10升壺四次,6升壺一次灌45升壺,得到1升水,然後灌滿10升壺三次得30升水,加起來為31升。
一般地我們有“灌水定理”:
“如果有n個壺容積分別為A1,A2,……,An(Ai均為大於0的整數)設w為另一大於0的整數。則用此n個壺可倒出w升水的充要條件為:(1)w小於等於A1+A2+……+An;(2)w可被(A1,A2,……,An)(這n個數的最大公約數)整除。”
這兩個條件都顯然是必要條件,如果(1)不被滿足的話,你連放這麼多水的地方都沒有。(2)的道理和上麵兩個壺的情況完全一樣,因為在任何步驟中,任何壺中永遠隻有(A1,A2,……,An)的倍數的水。
現在我們來看一下充分性。在中學裏我們學過,如果兩個整數a和b互素的話,那麼存在兩個整數u和v,使得ua+vb=1。證明的方法很簡單:在對a和b做歐幾裏德輾轉相除時,所有中間的結果,包括最後得到的結果顯然都有ua+vb的形式(比如第一步,假設a小於b,記a除b的結果為s,餘數為t,即b=sa+t,則t=(-s)a+b,即u=-s,v=1)。而兩個數互素意味著歐幾裏德輾轉相除法的最後一步的結果是1,所以1也可以記作ua+vb的形式。稍微推廣一點,如果(a,b)=c,那麼存在u和v使得ua+vb=c(兩邊都除以c就回到原來的命題)。