Introduce the topic:
小凯有3元和7元两种面值的金币无数个,他发现自己无法支付价格为1,2,4,5,8,11元的物品,除此之外任何价格都可以支付,
比如12=3*4+7*0,
13=3*2+7*1,
14=3*0+7*2...
Problem:
小凯有a元和b元两种面值的金币无数个(a,b互质),请求出无法被支付的最大金额。(如例子中的“11”)
Answer:
a*b-a-b
Proof:
a*(b-1)显然可以被表示,且只有一种方法:使用b-1张面值为a的钱,
这其实就是解a*b-a=x*a+b*y
移项得x=(a-y)*b/a-1=b -1 - y*b / a,
又因为y小于a且a、b的最小公倍数是a*b
所以只有当y=0时x有整数解b-1
下面证明a*(b-1)+n(n∈N*)都可以被表示:
a*(b-1)+n≡n(mod a)
假设使用k张b,那么
a*(b-1)+n-kb≡n-kb(mod a)
如果存在k,使得n-kb≡0(mod a),则可用k张b和若干张a表示
而这个k显然就是n*b-1 mod a(因为a、b互质,所以b关于a的逆元存在)
下面考虑a*(b-1)-n元钱,
当n<b时,只需在价值a*(b-1)+(b-n)的方案里减去一张b,证明方法同上
当n = b时,不可能用b表示a*(b-1)元钱,也就不可能表示出a*(b-1)-b元钱
所以最大不能支付的钱是a*b-a-b
Code:
历史上最短的代码。