這道題是筆者當年參加競賽的題目,多年來一直未得其解,久久不能釋懷。近日,從新拿起該題細細研究,終於將其解出,著文以記之。blog
問題描述:排序
長方體長X,寬Y,高Z。X、Y、Z都是正整數。長方體由長一、寬一、高1的正方體堆積而成。那麼長方體的體對角線穿過多少個正方體?ip
這個題考量三維空間的想象。近日研究的時候,嘗試先考量二維的狀況,在求解出二維的狀況下,在推廣到三維裏。下面是二維狀況下的問題描述get
長方形長X,寬Y。X、Y都是正整數。長方形由長一、寬1的正方形組成。那麼長方形的對角線穿過多少個正方形?it
以實例說明。長方形長6,寬4。長方形由長一、寬1的正方形組成。那麼長方形的對角線穿過多少個正方形?cli
這個仍是比較簡單的,直接用圖表示便可,以下圖所示:擴展
如上圖所示,對角線一共穿過8個正方形(灰色部分)。可是,咱們不可能每一個問題都畫圖表示,好比長777,寬581的長方形的解就很難畫圖表示(數字太大,不容易精確表示)。gc
仔細看看,這8個正方形實際上把對角線分紅了8段。線段的端點是對角線和水平線(或豎直線)的交點。im
因而,問題彷佛能夠轉化成d3
要求穿過多少個正方形,實際上至關於求有多少個線段
要求有多少個線段,實際上至關於求對角線和水平線和垂直線的交點的個數
把上圖放在平面直角座標系中,左下角座標爲(0,0),右上角座標爲(6,4)
則對角線的直線方程爲
和咱們通常想象中的直線方程不太同樣。不要緊,首先這個是正確的直線方程,其次是爲了和後面的三維中的直線方程的表現形式統一。
咱們把對角線和水平線(或豎直線)的交點在圖上標示出來(爲了後文的描述方便,我用不一樣顏色標示點)
左下角的起點用灰色標示,紅色的點標示對角線和豎直線的交點(交點的橫座標是整數),綠色的點標示對角線和水平線的交點(交點的縱座標是整數)
起點不算,則穿過的方塊數和線段數和點的個數一致(都是8個)。
紅色點的座標(橫座標是整數)分別是:
個數和長方形的長的數值是一致的(是6)
綠色點的座標(縱座標是整數)分別是:
個數和長方形的寬的數值是一致的(是4)
能夠看出,紅色點和綠色點有2個點是重合的(圖上用半紅半綠的點標示),所以這些點合在一塊兒就是以下(按照和起點的遠近來進行排序)
因而該問題的求解過程能夠以下表示:
一、求出橫座標是整數的點的個數,就是長方形長的數值。本題是6
二、求出縱座標是整數的點的個數,就是長方體寬的數值。本題是4
三、求出步驟1和步驟2中重合的點的個數,也就是橫縱座標都是整數的點的個數。本題是2
四、問題的答案:步驟1的答案+步驟2的答案-步驟3的答案。本題是6+4-2=8
步驟一、二、三、4中,關鍵是步驟3,如何求出步驟1和步驟2中重合的點的個數,也就是橫縱座標都是整數的點的個數。
最大公約數:正整數a和b,若a能被b整除,則a是b的倍數,b是a的約數。正整數a和b中約數最大的那個稱爲a和b的最大公約數,記做gcd(a,b)
本題中,(4,6)=2,正好是步驟3的答數,是巧合麼?不是,接下來咱們來證實。
證實:長X、寬Y的長方形,對角線通過雙整數點(橫縱座標都是整數)的個數爲gcd(X,Y)(注:不算起點)
證:令x1=X/gcd(X,Y),y1=Y/gcd(X,Y)。則x1和y1都是整數,且x1和y1互質(除1之外,沒有公約數)。
對角線所在的直線方程爲
當x取整數時(1≤x≤X)時,要使y也是整數,則x必須取x1的倍數(這樣才能把分母徹底約掉)
而在1到X之間,x1的倍數一共有gcd(X,Y)個
證實完畢
綜上所述:長方形長X,寬Y。X、Y都是正整數。長方形由長一、寬1的正方形組成。那麼長方形的對角線穿過多少個正方形?
其解爲:Ans=X+Y-gcd(X,Y),能夠用下圖表示
例如:
長6,寬4的長方形的對角線穿過6+4-gcd(6,4)=6+4-2=8個正方形
長5,寬3的長方形的對角線穿過5+3-gcd(5,3)=5+3-1=7個正方形
長12,寬8的長方形的對角線穿過12+8-gcd(12,8)=12+8-4=16個正方形
擴展到三維。長方體長X,寬Y,高Z。X、Y、Z都是正整數。長方體由長一、寬一、高1的正方體堆積而成。那麼長方體的體對角線穿過多少個正方體?
長X、寬Y、高Z的立方體的體對角線的直線方程是
這個方程雖然有點怪,可是學過空間解析幾何的都明白這個方程的正確性
求解的過程和二維的相似,也是找尋座標是整數的點。能夠用下圖表示:
其解爲:Ans=X+Y+Z-gcd(X,Y)-gcd(X,Z)-gcd(Y,Z)+gcd(X,Y,Z)
例如:
長5,寬3,高4的長方體的體對角線穿過5+3+4-gcd(5,3)-gcd(5,4)-gcd(3,4)+gcd(5,3,4)=5+3+4-1-1-1+1=10個正方體
長8,寬6,高3的長方體的體對角線穿過8+6+3-gcd(8,6)-gcd(8,3)-gcd(6,3)+gcd(8,6,3)=8+6+3-2-1-3+1=12個正方體
長12,寬8,高6的長方體的體對角線穿過12+8+6-gcd(12,8)-gcd(12,6)-gcd(8,6)+gcd(12,8,6)=12+8+6-4-6-2+2=16個正方體
下圖是長5,寬3,高4的長方體的體對角線穿過正方體的示意圖,一共10個正方體,你看清了麼?
這個題歷時若干年,老是百思不得其解。也是今朝靈光一閃,終於把該題解決了。也總算是一塊石頭落了地