蓝桥杯真题练习--余数系列

目录

1427 买不到的数目

2682 GCD


1427 买不到的数目

题目描述

小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。
小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。
你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。
本题的要求就是在已知两个包装的数量时,求最大不能组合出的数字。

输入格式

两个正整数,表示每种包装中糖的颗数(都不多于1000)

输出格式

一个正整数,表示最大不能买到的糖数 

样例输入

4 7

样例输出

17

解决思路

本题实质是在求,两个正整数最大的不能“凑出来”的数。

依据题目描述,在自然数域里,某一个节点之前有的数能够被“凑出”,有的不能,而在这个节点之后所有的数都能被“凑出”。我们需要去找到这个节点的位置。

以题目给出的样例为例,要找到不能被4和7凑出的最大数。

将所有自然数分为4类:被4整除、除4余1、除4余2、除4余3。显而易见,第一类自然数(被4整除)能够通过4不断地叠加来“凑出”,其中最小的能被“凑出”的数是4,在4之后的所有第一类数均能被“凑出”。也就是说,[4,8,12,16,20......] 都能被“凑出”。

而其余三类自然数,单凭4凑出是不可能的,还需要有7的帮助。例如,加一个7,可以“凑出”第四类自然数(除4余3),这类数中最小的能被“凑出”的数也正是7,在7之后的所有第四类数均能被“凑出”(不断地往上加4即可)。也就是说,[7,11,15,19,23......] 都能被“凑出”。

同理,加两个7,可以“凑出”第三类自然数(除4余2),这类数中最小的能被“凑出”的数是14,在14之后的所有第三类数均能被“凑出”。也就是说,[14,18,22,26,30......] 都能被“凑出”。

再同理,加三个7,可以“凑出”第二类自然数(除4余1),这类数中最小的能被“凑出”的数是21,在21之后的所有第二类数均能被“凑出”。也就是说,[21,25,29,33,37......] 都能被“凑出”。

21>14>7>4,显而易见第二类的节点是最大的,在21之前的第二类自然数都不能被4和7“凑出”,其中最大的就是21-4=17。

代码

a,b = map(int,input().split())
a,b = min(a,b),max(a,b)

all_nums = []

# 所有自然数被分成了a类(余1、余2、...、余a-1,没考虑余0情况)
for i in range(1,a-1): 
    c = 1
    while c*b%a!=i:  # c*b是该类数下,最小的能够被凑出的数
        c += 1
    all_nums.append(c*b)

print(max(all_nums)-a)

2682 GCD

题目描述

给定两个不同的正整数 a, b,求一个正整数 k 使得 gcd(a + k, b + k) 尽可能大,其中 gcd(a, b) 表示 a 和 b 的最大公约数,如果存在多个 k,请输出所有满足条件的 k 中最小的那个。 

输入格式

输入一行包含两个正整数 a, b,用一个空格分隔。 

输出格式

输出一行包含一个正整数 k。

样例输入

5 7

样例输出

1

解决思路

既然a+k,b+k都能被同一个数(这里设做m)整除,那么说明a除以m的余数和b除以m的余数是相同的。

由于a%m==b%m,那么(a-b)%m肯定等于0,a-b肯定是m的整数倍。而题目要求我们找到那个最大的那个m,所以m就是a-b。k就是m-a%m(或者m-b%m)。

代码

a,b = map(int,input().split())

m = abs(a-b)

print((m-a%m)%m)

三行就搞定。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值