蓝桥 买不到的数目 python 数论 /记忆搜索

博主@愿此后再无WA决定全力以赴准备蓝桥杯比赛,暂停博客更新。分享了一种思路,当两个数互质时,如何找到无法由它们组成的最大数。通过递归和记忆化搜索解决这个问题,寻找连续递增数字中无法被组合的最大数。代码实现中展示了如何找到满足条件的数字。
摘要由CSDN通过智能技术生成

想说的话

大家好🌼🌼,我是 @愿此后再无WA,可以叫我小A🌀🌀,一位阳光帅小伙,对算法领域比较感兴趣。如果我的文章对您有用,欢迎持续关注,我们一起进步!🎈🎈

很抱歉各位😪😪,现离蓝桥杯仅剩一个月时间,我临时改变了计划,转为全心备战蓝桥,因为这个省一对我来说太重要了,也是我最后一次机会,我一定要拿到手📌📌,那么这样的话我在博客上花的时间就会少了很多,也将导致博客文章质量明显下降,在此我给大家说声抱歉💥💥


🌟🌟这些日子我真的很开心,博客上能遇到一群志同道合的兄弟姐妹真的很幸福,没有你们的支持与鼓励我早就坚持不下去了,因为有你们我才能走的更远☀️☀️熬过这段时期我一定会回来的,爱你们❤️❤️

买不到的数目

在这里插入图片描述

思路

题目说不需要考虑无解的情况说明这两个数互为质数。如果不互为质数,那么可以组成的数字就是较小的数的倍数,可以无限延伸,无确切的解。既然互质的话,那么无法组成最大的数就可以通过公式求出来了
在这里插入图片描述
那这个公式怎么求的?如果发现一串连续递增数字可以连续N次被组合出来,而这个N==min(a,b)的话,那么这串数字的前一个数就是就是无法组成的最大数了。因为之后的数都能匹配。 比如给出两个数4,7 18 = 4+7+7, 19 = 4+4+4+7,20=45、21=37。都能够被组合出来,之后的数可以通过18+4,19+4…组合出来,因此18-1=17就是无法组成最大的数了。

import os
import sys

# 请在此输入您的代码
def find(res):  # 递归判断
    if res < 0:
        return False
    
    if res == 0:
        return True
    
    a = res-N
    b = res-M

    if a not in used:   # 记忆搜索
        used[a] = find(a) if a >= 0 else False
    if b not in used:
        used[b] = find(b) if b >= 0 else False
        
    return used[a] or used[b]


N,M = map(int,input().split())

used = {}  # 记忆数组

cnt = 0

for i in range(max(N,M)+1,int(1e9)):
    if find(i):
        cnt += 1
        mi = min(N,M)
        if cnt == mi:
            print(i-mi)
            break
    else:
        cnt = 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愿此后再无WA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值