洛谷P3951 [NOIP 2017 提高组] 小凯的疑惑

P3951 [NOIP 2017 提高组] 小凯的疑惑

题目背景

NOIP2017 提高组 D1T1

题目描述

小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?

注意:输入数据保证存在小凯无法准确支付的商品。

输入格式

两个正整数 \(a\) 和 \(b\),它们之间用一个空格隔开,表示小凯中金币的面值。

输出格式

一个正整数 \(N\),表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。

输入输出样例 #1

输入 #1

3 7

输出 #1

11

说明/提示

【输入输出样例 1 说明】

小凯手中有面值为 \(3\) 和 \(7\) 的金币无数个,在不找零的前提下无法准确支付价值为 \(1,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 ≡ m a (mod b)\)
则
\(x = m a + n b\)
讨论n:

如果\(n ≥ 0\),那么x就不是答案,舍去
所以\(n < 0\)

讨论m:

如果\(m < 0\),那么不符合\(ma > 0\),舍去
如果\(m = 0\),那么\(x = n b\)就不是答案,舍去
所以\(m > 0\)

如果\(m = b\),那么x不是答案,舍去
如果\(m > b\),设\(m = b + s\),那么\(m a = (b + s) a = b a + s a\)不满足\(m a < b\),舍去
所以\(m < b\)

又\(m,n ∈ Z\)
所以
\(m ∈ [1,b-1]\)
\(n ≤ -1\)
所以\(x = m a + n b\)
\(≤ (b-1) a + (-1) b\)
\(= a b - a - b\)
就是答案
还有,记住了小凯,小卖部是可以找钱的......

ACcode

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1;
ll a,b;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin>>a>>b;
    cout<<a*b-a-b<<endl;
    return 0;
}
//Author:AAA_jiancaipifa
posted @ 2026-10-18 16:01  AAA_jiancaipifa  阅读(4)  评论(0)    收藏  举报