应该叫程序员的疑惑
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
输入 3 7 输出 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
15=3×5+7×0
代码
#include<cstdio> using namespace std; int main() { long long a,b; scanf("%lld%lld",&a,&b); printf("%lld",a*b-a-b); return 0; }
哼哼,如此潦草的代码。。居然是如此潦草的代码???!!!
好的吧,看了luogu题解中大佬们的证明【完美证明了我的蒟蒻属性】
分析
不妨设 a < b
假设答案为 x
若x≡ma(modb)(1≤m≤b−1)
即
x=ma+nb(1≤m≤b−1)
显然当 n≥0 时 x 可以用 a, b 表示出来,不合题意。
因此当 n = -1时x取得最大值,此时x=ma−b。
显然当 mm 取得最大值 b−1时x最大,此时x=(b−1)a−b=ab−a−b
因此 a, b所表示不出的最大的数是 ab - a - b