小凯的疑惑

题目链接

题目大意

小凯有面值为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 }

 

posted @ 2019-07-20 11:34  liqgnonqfu  阅读(485)  评论(0编辑  收藏  举报