P3951 [NOIP 2017 提高组] 小凯的疑惑
题目背景
NOIP2017 提高组 D1T1
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?
注意:输入数据保证存在小凯无法准确支付的商品。
输入格式
两个正整数 aaa 和 bbb,它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 NNN,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例 #1
输入 #1
3 7
输出 #1
11
说明/提示
【输入输出样例 1 说明】
小凯手中有面值为 333 和 777 的金币无数个,在不找零的前提下无法准确支付价值为 1,2,4,5,8,111,2,4,5,8,111,2,4,5,8,11 的物品,其中最贵的物品价值为 111111,比 111111 贵的物品都能买到,比如:
12=3×4+7×012 = 3 \times 4 + 7 \times 012=3×4+7×0;
13=3×2+7×113 = 3 \times 2 + 7 \times 113=3×2+7×1;
14=3×0+7×214 = 3 \times 0 + 7 \times 214=3×0+7×2;
$15 = 3 \times 5 + 7 \times 0 $。
【数据范围与约定】
对于 30%30\%30% 的数据: $1 \le a,b \le 50 $。
对于 60%60\%60% 的数据: $1 \le a,b \le 10^4 $。
对于$ 100%$ 的数据:$1 \le a,b \le 10^9 $。
C++实现
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a % b);
}
void ex_gcd(ll a, ll b, ll &x, ll &y){
if(b == 0){
x = 1, y = 0; return;
}
ex_gcd(b, a % b, y, x);
y -= (a / b) * x;
}
ll a, b;
int main(){
cin >> a >> b;
if(a > b) swap(a, b);
ll x, y;
ex_gcd(a, b, x, y);
if(x > 0){
swap(a, b);
swap(x, y);
}
ll tmp = (-x) / b;
x = x + tmp * b;
y = y - tmp * a;
while(x < 0) x = x + b, y = y - a;
while(x > 0) x = x - b, y = y + a;
ll ans;
ll xx2 = x + b;
ans = a * (xx2 - 1) + b * (y - 1);
cout << ans - 1 << endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P3951 NOIP 2017 提高组 小凯的疑惑&spm=1001.2101.3001.5002&articleId=148154146&d=1&t=3&u=4af2e6d7843e4b29bc53b29718c357b1)
1998

被折叠的 条评论
为什么被折叠?



