题目描述
小凯手中有两种面值的金币,两种面值均为正整数且彼此互素。每种金币小凯都有 无数个。在不找零的情况下,仅凭这两种金币,有些物品他是无法准确支付的。现在小 凯想知道在无法准确支付的物品中,最贵的价值是多少金币?注意:输入数据保证存在 小凯无法准确支付的商品。
输入输出格式
输入格式
两个正整数 (a) 和 (b),它们之间用一个空格隔开,表示小凯中金币的面值。
输出格式
一个正整数 (N),表示不找零的情况下,小凯用手中的金币不能准确支付的最贵的物品的价值。
输入输出样例
输入样例#1
3 7
输出样例#1
11
说明
输入输出样例1 说明
小凯手中有面值为(3)和(7)的金币无数个,在不找零的前提下无法准确支付价值为(1,2,4,5,8,11) 的物品,其中最贵的物品价值为 (11),比 (11) 贵的物品都能买到,比如:
(12 = 3 imes 4 + 7 imes 0)
(13 = 3 imes 2 + 7 imes 1)
(14 = 3 imes 0 + 7 imes 2)
(15 = 3 imes 5 + 7 imes 0)
数据范围与约定
对于 (30\%) 的数据:(1 le a,b le 50)。
对于 (60\%) 的数据:(1 le a,b le 10^4)。
对于 (100\%) 的数据:(1 le a,b le 10^9)。
题解
这是一道很好的猜结论数论题。
看到样例,不是(3 imes 7 - 10 = 11)吗?于是,我们大胆地提交了刚才的结论所对应的代码。
咦?怎么没有(AC)?仔细一看数据范围:(1 le a,b le 10^9),(10^9 imes 10^9)不是爆了(int)吗?于是赶快把(int)改为(long) (long)。
于是,我们就(AC)了!
不过,我们还是要证明一下刚才的结论:
设币值分别为(a)、(b)。
容易得到:(a imes b)肯定可以用这两个币值表示出来。
(a imes b - a)呢?当然也可以,用(b - 1)张(a)就可以了。
(a imes b - b)呢?当然也可以,用(a - 1)张(b)就可以了。
(a imes b - a - b)呢?貌似不能了。
因式分解一下:
(a imes b - a - b)
(= a(b - 1) - b)
(= a(b - 1) - (b - 1) - 1)
(=(a - 1)(b - 1) - 1)
分不了了,说明(a imes b - a - b)不能用币值为(a)、(b)的钱凑出来。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
using namespace std;
inline long long gi()
{
long long f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
return f * x;
}
long long a, b;
int main(void)
{
a = gi(), b = gi();
cout << a * b - a - b;
return 0;
}