题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。
输入格式
输入数据仅一行,包含两个正整数a和 b,它们之间用一个空格隔开,表示小凯手中金币的面值。
输出格式
输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
样例
样例输入
3 7
样例输出
11
样例说明
小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为 1、2、4、5、8、11的物品,其中最贵的物品价值为11。
比11贵的物品都能买到,比如:
12 = 3 × 4 + 7 × 0 12=3×4+7×0 12=3×4+7×0
13 = 3 × 2 + 7 × 1 13=3×2+7×1 13=3×2+7×1
14 = 3 × 0 + 7 × 2 14=3×0+7×2 14=3×0+7×2
15 = 3 × 5 + 7 × 0 15=3×5+7×0 15=3×5+7×0
数据范围与提示
对于 30 % 30\% 30%的数据: 1 ≤ a , b ≤ 50 1≤a,b≤50 1≤a,b≤50;
对于 60 % 60\% 60%的数据: 1 ≤ a , b ≤ 10 , 000 1 \le a,b \le 10,000 1≤a,b≤10,000;
对于 100 % 100\% 100%的数据: 1 ≤ a , b ≤ 1 , 000 , 000 , 000 1 \le a,b \le 1,000,000,000 1≤a,b≤1,000,000,000。
分析
斐蜀定理说的是对于任意正整数
a
,
b
a,b
a,b,其最大公约数为
gcd
(
a
,
b
)
\gcd(a,b)
gcd(a,b),则一定存在整数对
m
,
n
m,n
m,n,使得
gcd
(
a
,
b
)
=
m
a
+
n
b
\gcd(a,b)=ma+nb
gcd(a,b)=ma+nb
但是实际上,我们没有用到这个定理。GPT告诉我最后的解法是用它做的。大佬们可以想想为什么。本人水平有限,暂未想到。
对于给定的 a = 3 , b = 7 a=3,b=7 a=3,b=7,答案是 11 11 11。我们就会想到为什么这个数这么小?由此继续猜想:是否存在 M M M,使得任意大于它的数都能表示为 3 a + 7 b 3a+7b 3a+7b?
如果一个数 z z z可以表示为 3 a + 7 b 3a+7b 3a+7b,那么 z − 3 a z-3a z−3a一定可以整除7。而对于任意一个数 z z z,在 z , z − 1 , z − 2 , . . . , z − 6 z,z-1,z-2,...,z-6 z,z−1,z−2,...,z−6这几个数里有且只有一个能被7整除的。同理,这7个数各自减去7的若干倍也总有能被7整除的那列数。我们把它们做成矩阵的格式:
0,1,2,3,4,5,6
7,8,9,10,11,12,13
14,15,16,17,18,19,20
21,22,23,24,25,26,27
…
不停写下去你就会发现,每一列第一个 3 3 3的倍数(包括 0 0 0)的上一行的那个数就是该列最大的不能被表示为 3 a + 7 b 3a+7b 3a+7b的数。
证明:假设第 j j j列第一个 3 3 3的倍数为 f ( j ) f(j) f(j),那么 f ( j ) f(j) f(j)自己首先就可以表示成 3 × a + 7 × 0 3×a+7×0 3×a+7×0的形式。
- 但是它上面的所有数都不符合要求。这是因为,它上面的所有数就是 f ( j ) f(j) f(j)减 7 7 7的若干倍但又大于 0 0 0的全部可能值,而这些值没有一个能被 3 3 3整除。
- 它下面的所有数都符合要求。取任意整数 Δ i > 0 \Delta i>0 Δi>0, f ( j ) + 7 Δ i f(j)+7\Delta i f(j)+7Δi即为这些数的通用形式,我们很容易想到 f ( j ) f(j) f(j)是3的倍数, 7 Δ i 7\Delta i 7Δi是7的倍数。
所以现在我们只需要找到每列最小的3的倍数,然后比较它们的大小后,选择最大的那个减1即是答案。
实际上,我们会发现只要从0开始,连续选取7个3的倍数后就可以了,因为他们总分布在不同的列。(如下所示,本人暂未想到如何证明)。所以,第7个3的倍数的上一行就是答案。
00,01,02,03,04,05,06
07,08,09,10,11,12,13
14,15,16,17,18,19,20
21,22,23,24,25,26,27
…
用数学形式表示: 3 × ( 7 − 1 ) − 7 = 11 3×(7-1)-7=11 3×(7−1)−7=11。
由此推广到任意互素的 a , b a,b a,b(设 a ≤ b a\leq b a≤b),就可知: max ∀ x , y ∈ N ∗ , a x + b y ≠ z z = a ( b − 1 ) − b = a b − a − b \max _{\forall x,y\in N^*, ax+by\neq z}{z}=a(b-1)-b=ab-a-b ∀x,y∈N∗,ax+by=zmaxz=a(b−1)−b=ab−a−b
代码实现
根据上述分析,只要求出 a b − a − b ab-a-b ab−a−b即可。在此之前需要让 a , b a,b a,b满足 a ≤ b a\leq b a≤b的关系。
#include <bits/stdc++.h>
using namespace std;
int main() {
long long a, b;
cin >> a >> b;
if (a > b) {
long long tmp = a;
a = b;
b = tmp;
}
cout << a * (b - 1) - b;
}
大道至简。