##思路:
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)