[leetcode]Water and Jug Problem

今天無聊打開了下leetcode,看到一個新題,結論挺簡單的,來證明下這個結論吧。
題目鏈接
題意很簡單,就是兩個容量分別為a和b的桶,你用他們是否可以量出體積為m的水,只能裝滿或者倒完。

簡化一下題目其實就是下面這個式子是否有解,如果有就是true,沒有就是false。

xa + yb = m, m > 0, x,y,a,b都是整數

可以在網上搜索一下這個題的題解都寫的很簡單m是否被gcd(a,b)整除,如果是就是true,如果不是就false。但是沒有人給出了為什么(可能是吧沒看到)。

設有集合S = {m = xa + yb, n > 0},d是集合S中最小的元素 d = ua + vb
x也是S中的元素,且 x = qd + r,x不被d整除, 那么 r > 0 and r < d

r = x - qd
  = xa + yb - qd
  = xa + yb -q(ua + vb)
  = (x - qu)a + (y-qb)b

那么r也是屬于S,并且r < d和d是最小的元素這個假設矛盾,那么我們可以得到S中的元素一定是最小元素d的倍數,也就是能被d整除

|a|是屬于S的,因為a>0,令x=1,y=0, a<0令x=-1,y=0。
同理|b|也屬于S。我們題目里面a,b都是大于0的。
d是最小元素,且同時要整除a, b,那么d的范圍只能只1 <= d <= gcd(a,b)

我們先得到1<=d<=gcd(a,b)這個結論,我們接下來繼續確定d的取值。

d=ua+vb,從gcd(a,b)的定義來看d是能被gcd(a,b)整除的,因為ua能被gcd(a,b)整除,且vb也能
那么d>=gcd(a,b)
1) 1<=d<=gcd(a,b)
2) d >= gcd(a,b)
那么d = gcd(a,b)

所以我們得到S中最小元素d=gcd(a,b)
結合上面的結論得到S中所有元素都是gcd(a,b)的倍數。
所以我們只需要看 m 是否被 gcd(a,b)整除就知道xa + yb = m是否有解了。

代碼很簡單,就懶得貼了。

PS.不知道簡書怎么打公式,所以上面證明的格式有點亂

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:選D,7+9=16;9+(-1)=8;(...
    Alex_bingo閱讀 19,160評論 1 19
  • 看到照片,相信很多人都熟悉,小學四年級語文中就有一篇文章叫《桂林山水》。那會還小不懂欣賞什么語言優美、簡練,也不沒...
    鳶尾蘇閱讀 345評論 0 1
  • “助推”是一種深含價值觀和目標,同時充分考慮到如何調動資源、制定有效流程、使目標得以實現、使價值觀得以堅守的“硬球...
    gyl58365閱讀 1,529評論 0 1
  • 我家大寶屬于有點鬼馬精靈的孩子,大部分的時間里都她非常有主見,堅持自我,并且有點調皮搗蛋。當然偶爾她也會為了討得父...
    如水年華閱讀 884評論 0 49