洛谷 P3951 NOIP 2017 小凯的疑惑
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 \(a\) 和 \(b\),它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 \(N\),表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
输入 #1
3 7
输出 #1
11
说明/提示
【输入输出样例 1 说明】
小凯手中有面值为\(3\)和\(7\)的金币无数个,在不找零的前提下无法准确支付价值为\(2,4,5,8,11\) 的物品,其中最贵的物品价值为 \(11\),比\(11\) 贵的物品都能买到,比如:
\(12 = 3 \times 4 + 7 \times 0\)
\(13 = 3 \times 2 + 7 \times 1\)
\(14 = 3 \times 0 + 7 \times 2\)
\(15 = 3 \times 5 + 7 \times 0\)
【数据范围与约定】
对于 \(30\%\)的数据: \(1 \le a,b \le 50\)
对于 \(60\%\)的数据: \(1 \le a,b \le 10^4\)
对于\(100\%\)的数据:\(1 \le a,b \le 10^9\)
分析
我们不妨设 \(a<b\),答案为\(x\)
如果\(x\)可以被\(a\)和\(b\)表示出来的话,那么就有
\(x=ma+nb(m \geq 0,n \geq 0)\)
但是\(x\)不能表达成上面的式子,我们要使\(x\)最大,因为\(a<b\),所以令\(n=-1\)
而且\(ma\)不能被\(b\)整除,否则\(b\)又会多出一个因子
因此\(m_{max}=b-1\)
所以\(x=a(b-1)-b=ab-a-b\)
当\(a > b\)时推出的式子完全相同,因此最终的答案为
\(ab-a-b\)
代码
#include<cstdio>
int main(){
long long a,b;
scanf("%lld%lld",&a,&b);
printf("%lld\n",a*b-a-b);
return 0;
}