noip2017 小凯的疑惑

 我终于会证了呜呜呜呜呜呜......

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:

历史上最短的代码。

 noip2017 小凯的疑惑

 

上一篇:.NET拾忆:反射的本质——元数据


下一篇:NOIP2017 Day2T3 列队