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小于aab的最小公倍数是a*b

所以只有当y=0x有整数解b-1

下面证明a*(b-1)+n(nN*)都可以被表示:

a*(b-1)+nn(mod a)

假设使用kb,那么

a*(b-1)+n-kbn-kb(mod a)

如果存在k,使得n-kb0(mod a),则可用kb和若干张a表示

而这个k显然就是n*b-1 mod a(因为ab互质,所以b关于a的逆元存在)

下面考虑a*(b-1)-n元钱,

nb时,只需在价值a*(b-1)+(b-n)的方案里减去一张b,证明方法同上

n = b时,不可能用b表示a*(b-1)元钱,也就不可能表示出a*(b-1)-b元钱

所以最大不能支付的钱是a*b-a-b

Code:

历史上最短的代码。

 图片

猜你喜欢

转载自www.cnblogs.com/vv123/p/12346860.html
今日推荐