NOIP2017--互质数问题

题目描述


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

输入格式

输入数据仅一行,包含两个正整数a和 b,它们之间用一个空格隔开,表示小凯手中金币的面值。

输出格式

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

样例

样例输入

3 7

样例输出

11

样例说明

小凯手中有面值为3和7的金币无数个,在不找零的前提下无法准确支付价值为 1、2、4、5、8、11的物品,其中最贵的物品价值为11。
比11贵的物品都能买到,比如:
12 = 3 × 4 + 7 × 0 12=3×4+7×0 12=3×4+7×0
13 = 3 × 2 + 7 × 1 13=3×2+7×1 13=3×2+7×1
14 = 3 × 0 + 7 × 2 14=3×0+7×2 14=3×0+7×2
15 = 3 × 5 + 7 × 0 15=3×5+7×0 15=3×5+7×0

数据范围与提示

对于 30 % 30\% 30%的数据: 1 ≤ a , b ≤ 50 1≤a,b≤50 1a,b50

对于 60 % 60\% 60%的数据: 1 ≤ a , b ≤ 10 , 000 1 \le a,b \le 10,000 1a,b10,000;

对于 100 % 100\% 100%的数据: 1 ≤ a , b ≤ 1 , 000 , 000 , 000 1 \le a,b \le 1,000,000,000 1a,b1,000,000,000

分析


斐蜀定理说的是对于任意正整数 a , b a,b a,b,其最大公约数为 gcd ⁡ ( a , b ) \gcd(a,b) gcd(a,b),则一定存在整数 m , n m,n m,n,使得
gcd ⁡ ( a , b ) = m a + n b \gcd(a,b)=ma+nb gcd(a,b)=ma+nb

但是实际上,我们没有用到这个定理。GPT告诉我最后的解法是用它做的。大佬们可以想想为什么。本人水平有限,暂未想到。

对于给定的 a = 3 , b = 7 a=3,b=7 a=3,b=7,答案是 11 11 11。我们就会想到为什么这个数这么小?由此继续猜想:是否存在 M M M,使得任意大于它的数都能表示为 3 a + 7 b 3a+7b 3a+7b

如果一个数 z z z可以表示为 3 a + 7 b 3a+7b 3a+7b,那么 z − 3 a z-3a z3a一定可以整除7。而对于任意一个数 z z z,在 z , z − 1 , z − 2 , . . . , z − 6 z,z-1,z-2,...,z-6 z,z1,z2,...,z6这几个数里有且只有一个能被7整除的。同理,这7个数各自减去7的若干倍也总有能被7整除的那列数。我们把它们做成矩阵的格式:

0,1,2,3,4,5,6
7,8,9,10,11,12,13
14,15,16,17,18,19,20
21,22,23,24,25,26,27

不停写下去你就会发现,每一列第一个 3 3 3的倍数(包括 0 0 0)的上一行的那个数就是该列最大的不能被表示为 3 a + 7 b 3a+7b 3a+7b的数

证明:假设第 j j j列第一个 3 3 3的倍数为 f ( j ) f(j) f(j),那么 f ( j ) f(j) f(j)自己首先就可以表示成 3 × a + 7 × 0 3×a+7×0 3×a+7×0的形式。

  • 但是它上面的所有数都不符合要求。这是因为,它上面的所有数就是 f ( j ) f(j) f(j) 7 7 7的若干倍但又大于 0 0 0的全部可能值,而这些值没有一个能被 3 3 3整除。
  • 它下面的所有数都符合要求。取任意整数 Δ i > 0 \Delta i>0 Δi>0 f ( j ) + 7 Δ i f(j)+7\Delta i f(j)+i即为这些数的通用形式,我们很容易想到 f ( j ) f(j) f(j)是3的倍数, 7 Δ i 7\Delta i i是7的倍数。

所以现在我们只需要找到每列最小的3的倍数,然后比较它们的大小后,选择最大的那个减1即是答案。

实际上,我们会发现只要从0开始,连续选取7个3的倍数后就可以了,因为他们总分布在不同的列。(如下所示,本人暂未想到如何证明)。所以,第7个3的倍数的上一行就是答案。

00,01,02,03,04,05,06
07,08,09,10,11,12,13
14,15,16,17,18,19,20
21,22,23,24,25,26,27

用数学形式表示: 3 × ( 7 − 1 ) − 7 = 11 3×(7-1)-7=11 3×(71)7=11

由此推广到任意互素的 a , b a,b a,b(设 a ≤ b a\leq b ab),就可知: max ⁡ ∀ x , y ∈ N ∗ , a x + b y ≠ z z = a ( b − 1 ) − b = a b − a − b \max _{\forall x,y\in N^*, ax+by\neq z}{z}=a(b-1)-b=ab-a-b x,yN,ax+by=zmaxz=a(b1)b=abab

代码实现


根据上述分析,只要求出 a b − a − b ab-a-b abab即可。在此之前需要让 a , b a,b a,b满足 a ≤ b a\leq b ab的关系。

#include <bits/stdc++.h>
using namespace std;
int main() {
    long long a, b;
    cin >> a >> b;
    if (a > b) {
        long long tmp = a;
        a = b;
        b = tmp;
    }
    cout << a * (b - 1) - b;
}

大道至简。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值