【蓝桥杯】买不到的数目

买不到的数目

题目:

小明开了一家糖果店。他别出心裁:把水果糖包成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)大于0,s、t不可能同时为负,所以方程1、2可以表示为任意gcd(a, b)的倍数,又因为a、b互质,gcd(a, b) = 1,因此可以t表示任意大于0的整数,证得等式ab – a – b + t = ma + nb成立!

总体思路是证明两个命题:

  1. ab - a - b被不可组合而成

  2. 大于ab - a - b的所有数都可以被组合而成

解题代码:

#include <stdio.h>

int main()
{
	long long a, b;
	
	scanf("%lld %lld", &a, &b);
	printf("%lld", a * b - a - b);
	
	return 0;
}
posted @ 2020-09-09 15:11  Tuzkizki  阅读(297)  评论(0编辑  收藏  举报