1. 程式人生 > >[藍橋杯][2013年第四屆真題]買不到的數目

[藍橋杯][2013年第四屆真題]買不到的數目

題目描述

小明開了一家糖果店。他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。糖果不能拆包賣。
小朋友來買糖的時候,他就用這兩種包裝來組合。當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。
你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。大於17的任何數字都可以用4和7組合出來。
本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

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

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

樣例輸入
4 7

樣例輸出
17

通過讀題過後,不難理解,題目無非就是求: x = a * num1 + b * num2, x無法滿足的最大數

這裡寫上兩個解法:
1)

通過在草稿紙上進行演算,類似寫遞推公式,發現一個規律
比如:輸入4 7
x取20 int temp = 21 / 7; // temp = 3
可以發現21 = 37+04(滿足)
22 = 27 + 24
23 = 17 + 44
24 = 07 + 64
25 = 37+ 14

temp = 28/7; // temp = 4;
28 = 47 + 04;
29
.
.
.
.
也就是說,對於一個數,只需要判斷 temp 次 是否有成立的
接著迴圈的最大值 x只可能小於num1*num2

import java.util.Scanner;

public class
Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in ); while (scanner.hasNext()) { int a = scanner.nextInt(); int b = scanner.nextInt(); int result=0; int c = 0; if(a>b){ //如果輸入的a>b,交換兩者的值,使b的值更大 int temp =a; a=b;
b=temp; } for(int i=1;i<a*b;i++){ int temp =i/b; //獲得需要判斷的次數 如輸入4 7 當i=50 temp=50/7 temp=7只需要判斷七次是否有滿足的情況 boolean flag=true; //用來判斷這幾次中是否 都無法滿足 for(int j=temp;j>=0;j--){ if((i-j*b)%a!=0){ c=i; }else{ flag=false; break; } } if(flag){ result=c; } } System.out.println(result); } } }

2)網上別人的解法
轉載來自 https://blog.csdn.net/qq_34594236/article/details/51484249

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		System.out.println(a*b-a-b);
	}
}

就這樣直接就AC了 ······

我和我的小夥伴都驚呆了

自然數a,b互質,則不能表示成ax+by(x,y為非負整數)的最大整數是ab-a-b.

證明:

a或者b是1的情況下容易證明.
以下情況都是a>1且b>1的情況.
首先證明ab-a-b不能表示成ax+by
假設ab-a-b=ax+by,那麼ab=am+bn (m,n都大於等於1)
左邊是a的倍數,右邊am是a的倍數,那麼要求bn也要是a的倍數
b不是a的倍數,只能要求n是a的倍數,這樣的話,bn=bn’a>=ba
那麼am=ab-bn所以am1矛盾.
接著證明ab-a-b+i能表示成ax+by(i>0)
因為ab互質,最大公約數就是1,根據輾轉相減的方法知ma+nb=1,
不妨假設m>0,n1(m=0意味著nb=1不可能的),所以ab-a-b+i(ma+nb)=(im-1)a+(a+in-1)b
im-1>0,現在只要證明a+in-1>=0,因為ima+inb=i
如果,|in|>ja其中j>0,那麼ima=i+|in|b>jab,所以im>jb
所以ima+inb=(im-jb)a-(|in|-ja)b=i,說明|in|>ja時,我們就能調整im,in使得|in|

很顯然,題目中沒有說明兩個數字是互質,如果是2和4 ,通過程式得出的結果是2。

這個結果顯然是錯誤的。但是很明顯oj並沒有設定這樣的數。。。

-----------------------------------------------割---------------------------------------------

時隔數月,回來繼續補充一下這道題目的求解。

題目中給出a個b,

1、我假裝大家都知道貝祖等式:ax+by = gcd(a,b)。證明略。我們可以求出這個特解,然後求出ax+by = c的通解。

2、這裡,題目要求的是有負整數解時(x,y中有負數)c最大是多少。

3、ax+by = c要有解時,則當 gcd(a,b)|c (c%gcd(a,b) == 0)時,該方程才有解。明顯,當gcd(a,b) 不為1時,方程無解的情況是無窮多個的,因此不存在最大不能組合的數。

4、我們總能求出x和y的一個特解,即把貝祖等式求解後的x和y,但是x和y的解可以是負數解。

5、顯然這裡x和y不能為負數,因此,該題目的問題得以有解答。求最大不能組合的數。

6、這裡又有一條定理:當gcd(a,b) == 1 時(a和b互質),當c>ab-a-b時,方程ax+by = c有非負解。所以最大不能組合出的數目就是 ab-a-b 。這裡假設大家都知道這條定理,當然不知道也沒關係,至少現在你知道了,可以自己試著證明一下,參考上面證明過程。