虽然答案一眼就能看出来,但是答案的证明还是比较有趣的
[NOIP2017 提高组] 小凯的疑惑 / [蓝桥杯 2013 省] 买不到的数目
题目背景
NOIP2017 提高组 D1T1
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
样例 #1
样例输入 #1
1 | 3 7 |
样例输出 #1
1 | 11 |
提示
【输入输出样例 1 说明】
小凯手中有面值为 3 和 7 的金币无数个,在不找零的前提下无法准确支付价值为 1, 2, 4, 5, 8, 11 的物品,其中最贵的物品价值为 11,比 11 贵的物品都能买到,比如:
12 = 3 × 4 + 7 × 0;
13 = 3 × 2 + 7 × 1;
14 = 3 × 0 + 7 × 2;
【数据范围与约定】
对于 30% 的数据:
对于 60% 的数据:
对于
解
a, b 是对称的,答案应该也是跟 a, b 对称的一个式子,先猜 a + b ,发现不是,然后换 a ⋅ b ,大了,发现 (a−1)(b−1) 正好是答案
于是猜测答案是 (a−1)(b−1) ,打个表发现还真是,就可以交了XD
证明
原题就是要找不满足 ax + by = c(x,y≥0) 的最大 c
首先 a, b 是互素的,所以 c ≡ ax mod b(a=0,1,2,...,b−1) 是互不同余的(遍历了模 b 的完系)
所以可以知道以下的数是可以表示的:
- c ≥ 0 且 c ≡ 0 mod b
- c ≥ a 且 c ≡ a mod b
- c ≥ 2a 且 c ≡ 2a mod b
- c ≥ 3a 且 c ≡ 3a mod b …
- c ≥ a(b−2) 且 c ≡ a(b−2) mod b
- c ≥ a(b−1) 且 c ≡ a(b−1) mod b
发现对于 c ≥ max (a(b−1),b(a−1)) 的数,都可以表示
因为 a, b 对称,所以可以不妨 a ≤ b
先看 (a−1)(b−1), (a−1)(b−1) + 1, ..., a(b−1) − 1 这 b − 1 个数,它们模 b 互不同余,并且模 b 不为 a(b−1) ,所以它们模 b 的余数一定落在 ka(k=0,1,2,...,(b−2)) 之间,所以它们模 p 的余数覆盖 ka(k=0,1,2,...,(b−2)) ,所以它们都可以被表示
再往前看,即 (a−2)(b−1), (a−2)(b−1) + 1, ..., (a−1)(b−1) − 1 这 b − 1 个数,它们模 b 互不同余,但是这 b − 1 个数只有 b − 2 个数可以被表示,所以必然有一个数不能被表示出来,并且因为我们是从后往前找的,所以这个数是最大的,即答案就在其中
从最后一个开始看, (a−1)(b−1) − 1 ≡ − a ≡ (b−1)a mod b ,而 (b−1)a 并不在 ka(k=0,1,2,...,b−3) 中,所以这个数无法被表示,答案被找到了
Q.E.D