【蓝桥杯】不可能的数目

买不到的数目

题目:

小明开了一家糖果店。他别出心裁:把水果糖包成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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值