洛谷 P3951 NOIP 2017 小凯的疑惑

洛谷 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;
}
原文地址:https://www.cnblogs.com/liuchanglc/p/13562096.html