题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
输入 #1
3 7
输出 #1
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
当连续3个以上的物品都能买到时
【数据范围与约定】
对于100%的数据:1≤a,b≤109
分析
很暴力的一个理解:
a ∗ b a*ba∗b是a和b的最小公倍数,可以被a表示,也可以被b表示。
a ∗ b − a a*b-aa∗b−a,相当于b ∗ ( a − 1 ) b*(a-1)b∗(a−1),只能被b表示。
a ∗ b − b a*b-ba∗b−b,相当于a ∗ ( b − 1 ) a*(b-1)a∗(b−1),只能被a表示。
a ∗ b − a − b a*b-a-ba∗b−a−b,不能被a或b表示。
那为什么a ∗ b − a − b a*b-a-ba∗b−a−b是最大的呢?
因为所有大于a ∗ b a*ba∗b,也就是a和b的最小公倍数的数,都可以被表示。
因为a ∗ b a*ba∗b再乘一个系数其实就可以把后面的-a-b给抵消。就会变成a的倍数与b的倍数的和。可以被表示
如果不懂自己去算一算,看一下是不是。
真的很神奇~~
上代码
两行代码的程序真香~
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
int main()
{
ll a,b;
cin>>a>>b;
cout<<a*b-a-b;
return 0;
}