链接:https://ac.nowcoder.com/acm/problem/16414
来源:牛客网
题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在小凯无法准确支付的商品。输入描述:
输入数据仅一行,包含两个正整数 a 和 b,它们之间用一个空格隔开,表示小凯手中金币的面值。
输出描述:
输出文件仅一行,一个正整数 N,表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。示例1
输入
复制3 7
输出
复制11
说明
小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为 1、2、4、5、8、11的物品,其中最贵的物品价值为11。
比11贵的物品都能买到,比如:
12 = 3 x 4 + 7 x 0
13 = 3 x 2 + 7 x1
14 = 3 x 0 + 7 x 2
15 = 3 x 5 + 7 x 0
备注:
对于 30% 的数据:1 ≤ a,b ≤ 50;
对于 60% 的数据: 1 ≤ a,b ≤ 10,000;
对于 100% 的数据:1 ≤ a,b ≤ 1,000,000,000。
解析:
定理: 对于正整数p , q满足gcd(p, q) = 1, 我们有px + qy = n 无非负整数解的最大正整数n 为pq - p - q .
证明如下:我们首先利用反证法, 证明px + qy ≠ pq - p - q : 我们假设存在正整数x 和y 使得px + qy = pq - p - q , 则有px + qy = pq - p - qp(x + 1) + q(y + 1) = pq
∵gcd(p,q)=1,p∣q(y+1)
∴p∣y+1
同理,q | x + 1
接着我们令y + 1 = pj , x + 1 = qk . 则有pqk + qpj = pqpq(j + k) = pq
注意到x, y≥ 0 , 我们有y+1≥1 且x+1≥1 , 因而j≥1 且k≥1 . 因而j+k≥2 , 因而假设不成立.得证.
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <string> 5 #include <cstring> 6 #include <cstdlib> 7 #include <cmath> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <vector> 13 #include <ctime> 14 #include <cctype> 15 #include <bitset> 16 #include <utility> 17 #include <sstream> 18 #include <complex> 19 #include <iomanip> 20 #define inf 0x3f3f3f3f 21 typedef long long ll; 22 using namespace std; 23 ll a,b; 24 int main(){ 25 cin>>a>>b; 26 ll jg=a*b-a-b; 27 cout<<jg<<endl; 28 return 0; 29 }