[藍橋杯][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 。這裡假設大家都知道這條定理,當然不知道也沒關係,至少現在你知道了,可以自己試著證明一下,參考上面證明過程。