今天無聊打開了下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.不知道簡書怎么打公式,所以上面證明的格式有點亂