题目背景
NOIP2017 提高组 D1T1
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。
输入格式
两个正整数 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。
【数据范围与约定】
对于 30% 的数据: 1≤a,b≤50。
对于 60% 的数据: 1≤a,b≤10^4。
对于100% 的数据:1≤a,b≤10^9。
解题思路:
假设该物品x能用面值a和面值b支付,则x=na+mb(n>=0,m>=0),n代表需要n张面值a的纸比,m代表需要m张面值b的纸币;
假设物品y不能用面值a和面值b支付,首先用n张面值a,再需要m张面值b,如果m>=0,则说明物品y可以支付,则不符合题意,所以m最大为-1;再来看n的取值,当n>=b时,即可写成n=b+k(k>=0),则y=(b+k)*a-b,化简成y=b*(a-1)+k*a,因为a>=1,则(a-1)>=0,又可表示为x=na+mb的形式,则说明物品y可以支付,则不符合题意,所以n最大为b-1。
则最大金额未能支付的物品y=(b-1)*a-b=ab-a-b;
AC代码:
#include<iostream>
using namespace std;
int main()
{
long long a=0, b=0;//a,b的最大取值为10^9,则ab要用long long
scanf("%lld%lld", &a, &b);
printf("%lld", a*b-a-b);
return 0;
}
希望能帮助到大家!