链接: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 }
01-15 17:41