[蓝桥杯] 买不到的数目
题目背景
NOIP2017 提高组 D1T1
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 a a a 和 b b b,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 N N N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
样例 #1
样例输入 #1
3 7
样例输出 #1
11
提示
【输入输出样例 1 说明】
小凯手中有面值为 3 3 3 和 7 7 7 的金币无数个,在不找零的前提下无法准确支付价值为 1 , 2 , 4 , 5 , 8 , 11 1,2,4,5,8,11 1,2,4,5,8,11 的物品,其中最贵的物品价值为 11 11 11,比 11 11 11 贵的物品都能买到,比如:
12 = 3 × 4 + 7 × 0 12 = 3 \times 4 + 7 \times 0 12=3×4+7×0;
13 = 3 × 2 + 7 × 1 13 = 3 \times 2 + 7 \times 1 13=3×2+7×1;
14 = 3 × 0 + 7 × 2 14 = 3 \times 0 + 7 \times 2 14=3×0+7×2;
15 = 3 × 5 + 7 × 0 15 = 3 \times 5 + 7 \times 0 15=3×5+7×0。
【数据范围与约定】
对于 30 % 30\% 30% 的数据: 1 ≤ a , b ≤ 50 1 \le a,b \le 50 1≤a,b≤50。
对于 60 % 60\% 60% 的数据: 1 ≤ a , b ≤ 1 0 4 1 \le a,b \le 10^4 1≤a,b≤104。
对于 100 % 100\% 100% 的数据: 1 ≤ a , b ≤ 1 0 9 1 \le a,b \le 10^9 1≤a,b≤109。
算法
(数论) O ( 1 ) O(1) O(1)
结论:
如果 a , b a, b a,b 均是正整数且互质,那么由 a x + b y , x ≥ 0 , y ≥ 0 ax + by, x \ge 0, y \ge 0 ax+by,x≥0,y≥0 不能凑出的最大数是 a b − a − b ab - a - b ab−a−b。
时间复杂度分析
计算 a b − a − b ab - a - b ab−a−b 的时间复杂度是 O ( 1 ) O(1) O(1)。
C++ 代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
LL a, b;
cin >> a >> b;
cout << a * b - a - b << endl;
return 0;
}