小凯的疑惑
题目大意
小凯有面值为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 }