藍橋杯 歷屆試題 買不到的數目python實現(數論)

資源限制
時間限制:1.0s 內存限制:256.0MB
問題描述
小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。

小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。

本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

輸入格式
兩個正整數,表示每種包裝中糖的顆數(都不多於1000)

輸出格式
一個正整數,表示最大不能買到的糖數

樣例輸入1
4 7
樣例輸出1
17
樣例輸入2
3 5
樣例輸出2
7

分析:
題目相當於是告訴我們解不定方程ax+by=zax+by=z,題目給了a,ba,b讓我們自己擬定x,yx,y使得獲得最大的取不到的zz值,意思就是求這個不定方程無正整數解情況下的最大zz值。

首先題目給的a,ba,b一定是互質的,他們的最大公約數是1,不然的話,能一直延伸到無窮大的時候無正整數解。其次,關於a,ba,b互質的不定方程最大的無正整數解有個公式就是,這個zz值最大爲ababa*b-a-b,用這個公式,可以一行搞定:

while True:
    try:
        a, b = map(int, input().split())
        print(a*b-a-b)
    except:
        break

在這裏插入圖片描述
數學真的是神奇啊!

那不知道公式怎麼寫呢?

我們知道a,ba,b兩個數是質數,最大公約數是1,那麼他們之間由ax+by=zax+by=z得到的最大的zz值肯定是aba*b,因爲超過aba*b,肯定能組合得到(最大公約數是1),所以我們直接建立一個列表,列表裏面存放ax+by=zax+by=zzz值,x in range(b + 1),y in range(a + 1),然後把這個列表從大到小排序,相鄰數字間隔超過1的必然是中間值取不到,輸出即可:

AC代碼:

while True:
    try:
        a, b = map(int, input().split())
        # print(a*b-a-b)      #一行完事了
        res = []
        for x in range(b + 1):
            for y in range(a + 1):
                if a * x + b * y <= a * b:
                    res.append(a * x + b * y)
        res.sort(reverse=True)
        for num in range(len(res)):
            if res[num] - res[num + 1] > 1:
                print(res[num] - 1)
                break
    except:
        break

編程小白歡迎指教

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章