目录
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)
三行就搞定。