[蓝桥杯2022初赛] 寻找整数(python)

本文介绍了一种解决数学问题的方法,通过寻找11和17的公倍数来满足给定的条件,首先暴力获取满足前25个条件的数,然后利用步长递增查找直到找到满足48个条件的最小答案。
摘要由CSDN通过智能技术生成

题目链接

##思路:

1.找到特殊条件,n%11==0 and n%17==0.这说明答案是17和11的公倍数

2.先找满足部分条件的答案(例如满足表格里前的25个条件)

3.在上面答案的基础上,快速接近满足所有条件的答案

##证明:

假如我们找到了满足前面25个条件的最小值n,假如最终的答案为ans(满足题目的48个条件)

那么,无论ans多么大,多么奇怪,ans肯定是满足前面25个条件的

因此,ans的值一定在所有满足前面25个条件的数的集合中

换句话说,满足前25个条件的集合一定包含了最终满足48个条件的答案

那么我们只需要先找到这个集合,然后再从小到大地检查其中的数是否满足题意

1.先“理智地”暴力获取满足前面25个条件的数n(n一定是11和17的倍数

2.这个n也许并不满足所有的条件(48个条件),因此我们要检查下一个可能满足题意的n'

如何获得n'呢?如果只用要满足n'%2=1,那么n’=n+2,可是还要满足n'%3=2呢!那么我们需要在n上面加上的一个数k=6,要求这个k不仅是2的倍数,还得是3的倍数。如果要满足所有条件的n',那么依次类推,下一个n' =n + lcm(2到25共24个数的最小公倍数),如果n’还不满足题意,那么就继续找下去。我们把这个最小公倍数叫做步长,由于步长很大,这个暴力解法会很快。


from math import lcm
from functools import reduce
from tqdm import tqdm
#先准备好需要的数据
a=list(range(0,49+1))
b=[0,0,1,2,1,4,5,4,1,2,9,0,5,10,
11,14,9,0,11,18,9,11,11,15,17,9,
23,20,25,16,29,27,25,11,17,4,29,22,
37,23,9,1,11,11,33,29,15,5,41,46]
start=0
#暴力获取满足前25个条件的数
for i in range(187,10**17,187):
    判断是否满足前25个条件
    flag=True
    for j in range(1,25) :
        if i%a[j]!=b[j]:
            flag=False
            break
    if flag:
        start=i
        break
print(start)
#找到步长
step=reduce(lcm,a[1:25])
print(step)
ans=0
for i in tqdm(range(start,10**17+1,step)):
    #判断是否满足题意
    flag=True
    for j in range(1,50) :
        if i%a[j]!=b[j]:
            flag=False
            break
    if flag:
        ans=i
        break
print(ans)

  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值