【洛谷P3951】小凯的疑惑【数论】

题目描述

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

输入格式

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

输出格式

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

输入输出样例

输入 #1

3 7

输出 #1

11

说明/提示

【输入输出样例 1 说明】
小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为1,2,4,5,8,11的物品,其中最贵的物品价值为 11,比11 贵的物品都能买到,比如:
12=3×4+7×0

13=3×2+7×1

14=3×0+7×2

15=3×5+7×0
当连续3个以上的物品都能买到时

【数据范围与约定】
对于100%的数据:1≤a,b≤109

分析

很暴力的一个理解:
a ∗ b a*bab是a和b的最小公倍数,可以被a表示,也可以被b表示。
a ∗ b − a a*b-aaba,相当于b ∗ ( a − 1 ) b*(a-1)b(a1),只能被b表示。
a ∗ b − b a*b-babb,相当于a ∗ ( b − 1 ) a*(b-1)a(b1),只能被a表示。
a ∗ b − a − b a*b-a-babab,不能被a或b表示。

那为什么a ∗ b − a − b a*b-a-babab是最大的呢?

因为所有大于a ∗ b a*bab,也就是a和b的最小公倍数的数,都可以被表示。
因为a ∗ b a*bab再乘一个系数其实就可以把后面的-a-b给抵消。就会变成a的倍数与b的倍数的和。可以被表示
如果不懂自己去算一算,看一下是不是。
真的很神奇~~

上代码

两行代码的程序真香~

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
int main()
{
    ll a,b;
	cin>>a>>b;
	cout<<a*b-a-b; 
	return 0;
}


版权声明:本文为dglyr原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。