买不到的数目
题目:
小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。
输入:
两个正整数,表示每种包装中糖的颗数(都不多于1000)
要求输出:
一个正整数,表示最大不能买到的糖数
例如:
用户输入:
4 7
程序应该输出:
17
再例如:
用户输入:
3 5
程序应该输出:
7
题目分析:
观察题目,将题目抽象为有两个正整数a、b,可以组合成任意线性组合ax+by,x、y非负,求最大不能组合数。
由于不能组合而成的数我们不清楚公式,所以从可组合数入手分析。将可组合数设为c,那么c = ax + by。其中,x和y在题目中理解为两种不同包装的水果糖的包数。
这里需要导入数论中的一个定理:假设有两个正整数a、b,若它们的最大公约数gcd(a, b)不为1,那么它们的线性组合一定是gcd(a, b)的倍数。即它们不存在最大不可组合数,因此a、b一定互质。
现在,我们需要从一个数论的规律反证。
结论:自然数a、b互质,则不能表示为ax + by(x、y为非负整数)的最大整数是ab – a – b。
证明:(反证法)
当a或b为1的情况下容易证明,因此以下证明当a > 1且b > 1的情况。
假设ab – a – b = ax + by,那么ab = (x + 1)a + (y + 1)b。
左式为a的倍数,等式若成立,那么右式也是a的倍数,那么需要(y + 1)也是a的倍数,等式不成立。
到这里已经证明了ab – a – b是一个不可组合数,但没有证得是最大不可组合数。
再次利用反证法,证明大于ab – a – b的数都可以被组合而成:
若存在c > ab – a – b,即存在ab – a – b + t = ma + nb(m、n、t为非负整数),得到两个方程如下:
\1. t = (m + 1 - b)a + (n + 1)b
\2. t = (m + 1)a + (n + 1 - a)b
此时,右式可以表示为一正一负、一负一正、两个都是整数的情况。
又由裴蜀定理可知,gcd(a, b) = sa + tb(a、b为正整数,s、t为整数),其中gcd(a, b)必定为正数,s、t不可能同时为负,又因为a、b互质,因此方程1、2可以表示为任意大于0的整数,证得等式ab – a – b + t = ma + nb成立!
解题代码:
#include <stdio.h>
int main()
{
long long a, b;
scanf("%lld %lld", &a, &b);
printf("%lld", a * b - a - b);
return 0;
}