题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 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
using namespace std;
typedef long long LL;
int main() {
LL n, m;
cin >> n >> m;
cout << n * m - n - m << endl;
}