首页 > 技术文章 > 蓝桥杯之买不到的数目

walkthehorizon 2015-03-30 19:56 原文

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7

算法分析:

证明以下2个命题即可:
1. (x-1)(y-1)-1 不能被表示为 ax+by的形式
2. 大于等于(x-1)(y-1)都能被表示为 ax+by的形式

命题1用反证法即可。
假设 (x-1)(y-1)-1 = ax+by     (a、b>=0)
即 ax+by = xy-x-y
即 (a+1)x+(b+1)y=xy
所以 a+1要能整除y,设 a+1=cy (c>0)
所以 b+1要能整除x,设 b+1=dx (d>0)
(c+d)xy=xy
=> c+d=1
必有c和d中有一个<=0
与假设矛盾

1 #include <iostream>
2 using namespace std;
3 int main()
4 {
5 int a, b;
6 cin >> a >> b;
7 cout << a * b - a - b << endl;
8 return 0;
9 }

 

推荐阅读