小凯的疑惑

本文探讨了一种特定的数学问题,即使用面值为a和b的两种硬币(a,b互质)无法组合的最大面额。通过严谨的数学推导,证明了该最大无法组合面额为a*b-a-b,并附带提供了C++实现代码。

题目链接

题目大意

小凯有面值为a和b两种硬币(a,b互质),问凑不出的最大面额是多少?

思路

用ex_gcd的做法依然没看懂,但是我终于会解释为什么  a*b-a-b 是答案了(可能有点麻烦)。

 首先,a*b 是一定可以凑出来的。

 

然后,a*b+n(n为正整数) 也是可以凑出来的面额,即答案一定小于a*b,证明如下:

如果$ k_1*b\equiv k_2*b(mod a)$ 且a,b互质,那么$k_1 \equiv k_2(mod a)$  (两边乘逆元显然是对的)。这样

$b%a, 2*b%a, 3*b%a……a*b%a$这a个数一定是模a的完全剩余系(就是取遍模a的所有余数),

因此,一定存在k_1(=1,2,3...a),使得$k1\equiv-n(mod a)$ ,所以 $a*b+n=(a-k1)*b+(n+k_1*b) = x*b+y*a $ (其中,x,y显然一定是正整数)。

 

我们假设答案为 $ans=a*b-n$(n为正整数),不妨设

$n=k*a+r (0\leqslant r \leqslant a-1)$ ,$ a*b=(k_1+k_2)*b$ 其中,

$k_2*b \equiv r (mod a)$

那么 可以设

$ k_2*b-r = m*a\ \ \ \ \ \ \ \ (1)$

因此,原式可化为

$a*b-n=k_1*b+k_2*b-r-k*a=k1*b+(m-k)*a\ \ \ \ \ \ \ \ \ \  (2)$

如果 $a*b-n$不可被凑出,就说明 m-k<0,  不妨设$m = k-h (h \subseteq \mathbb{Z}_+)$ 代入(1)得

$r=k_2*b-(k-h)*a$

再将r代入n=k*a+r,化简得到$n=k_2*b+h*a$,要使 ans最大,就是使n最小,而$k_2,h$均为正整数,所以$n_{min}=a+b,ans_{max}=a*b-a-b$.证毕。

 

代码

 1 #include<cstdio>
 2 #include<iostream> 
 3 #include<cstring>
 4 
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     long long a,b;
10     cin>>a>>b;
11     long long ans=a*b-a-b;
12     cout<<ans<<endl;
13     return 0;
14 }

 

转载于:https://www.cnblogs.com/LiqgNonqfu/p/11216335.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值