洛谷 P3951 NOIP 2017 小凯的疑惑
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入格式
两个正整数 (a) 和 (b),它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 (N),表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
输入 #1
3 7
输出 #1
11
说明/提示
【输入输出样例 1 说明】
小凯手中有面值为(3)和(7)的金币无数个,在不找零的前提下无法准确支付价值为(2,4,5,8,11) 的物品,其中最贵的物品价值为 (11),比(11) 贵的物品都能买到,比如:
(12 = 3 imes 4 + 7 imes 0)
(13 = 3 imes 2 + 7 imes 1)
(14 = 3 imes 0 + 7 imes 2)
(15 = 3 imes 5 + 7 imes 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
",a*b-a-b);
return 0;
}