题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
简单的说就是你有两中数,每个数都有无数个,然后问你无法组成的数最大是多少。
首先题目保证了会存在答案,那么a,b肯定是互质的,那么不定方程ax+by = z,肯定是有解的,只是看x, y是不是正数了。我们设最大的无法表示的数为 x,显然
x
≡
a
∗
n
(
m
o
d
b
)
(
0
≤
n
≤
b
−
1
)
x \equiv a*n(mod b)(0≤ n ≤b-1)
x≡a∗n(mod b)(0≤n≤b−1)(n的范围的解释:若
n
≥
b
n ≥ b
n≥b 那么根据同余定理,
a
∗
n
%
b
≡
a
∗
(
n
%
b
)
%
b
a*n\%b \equiv a*(n\%b)\%b
a∗n%b≡a∗(n%b)%b 我们就相当于把a * n分成了两部分,
a
∗
n
=
a
∗
x
+
b
∗
y
a * n = a * x + b * y
a∗n=a∗x+b∗y 其中 x小于b,由于我们是在模b意义下的同余方程,所以
b
∗
y
b*y
b∗y最后在
m
∗
b
m*b
m∗b中(下面的公式) )
显然 x = a ∗ n + m ∗ b ( 0 ≤ n ≤ b − 1 ) x = a*n + m*b(0≤ n ≤b-1) x=a∗n+m∗b(0≤n≤b−1)
对于有解的情况,必定满足
n
,
m
≥
0
n,m\geq 0
n,m≥0,所以对于满足条件的
x
x
x,必定存在
n
<
0
n<0
n<0 或
m
<
0
m <0
m<0。为了使
x
x
x尽量的大,我们取
m
=
−
1
,
n
=
b
−
1
m = -1, n = b-1
m=−1,n=b−1 得
x
=
a
∗
(
b
−
1
)
−
b
x = a*(b-1)-b
x=a∗(b−1)−b
也就是
x
=
a
∗
b
−
a
−
b
x = a*b-a-b
x=a∗b−a−b
记得开long long
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main() {
LL n, m;
cin >> n >> m;
cout << n * m - n - m << endl;
}