前言
大家看过每年的真题应该都知道的,那些大数的题目暴力法都是求不出来的,电脑跑到死机可能还有那么一丢丢可能(搞笑.jpg)。
今年Python B组的第二题《寻找整数》也是这样子,看到很多群里面的小可爱们都是说跑到了7000万都还没有出结果hhh,不知道跑了多少个小时勒。
最近比较忙,我也是比赛近几天才看蓝桥杯准备一下省赛的,避免300RMB做慈善了,怎么也得捞一个省奖。这篇博客只是说一下我第二题的思路,其他的懒得写(因为我真的不会了QAQ)
一、它们之间有什么关系呢?
我们看一下题目先,它是让我们找一个一个不超过 10的17次方 的正整数 n,这个n是除以 2 至 49 后的余数已经是给定了的,具体可见下图,求这个正整数最小是多少?
我的第一眼:切,今年才48个数,暴力法应该完事啦,直接暴力看下一题…
做到了第五题它还没有结果QAQ
后面才想到一般蓝桥杯的大数题目没有这么简单的,我就认真寻找它们之间的关系,下面我们直接看(自己举的例子,并不是蓝桥杯题目上面的):
我们可以看到,当一组余数和一组除数固定的时候,下一个数字可以除以一组除数得到一样的一组余数的数字应该是上一个数字+当前一组除数的最小公倍数,看我上面写的例子应该可以懂(字丑.jpg)
二、详细解题代码
代码如下:
# -*- coding: utf-8 -*-
# @Author:小废物GGS
# @Time:2022/4/9 9:09
# @Software:PyCharm
import math
num1=[i for i in range(2,50)] #懒人直接自建数组,不想敲
num2=[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]
#这里余数很重要啊,一定要一个一个对准来敲,要不然GG
a=True #循环条件
i=0
ans=1
arr=[] #这个数组是存储已经除过的数组(2-49之间的)
#这个函数是求一个数组里面的最小公倍数的,和最小公倍数模版差不多的
def gbs(arr):
k=1
for i in arr:
k=k*i//math.gcd(k,i)
return k
while i<48: #一共就是48个数字嘛,下标是0-47哦,到48就可以停止了
if ans%num1[i]==num2[i]: #判断余数是否相等
arr.append(num1[i]) #相等就存进来
i+=1 #下标+1,继续判断
else:
ans+=gbs(arr) #如果余数不等的话,当前的数字+数组的最小公倍数
print(ans)
#print(2022040920220409)
大家一定要规范好变量名称,我上面变量名都是自己随意写的,所以我比赛的时候不小心把num1写成num2一直求num2(余数)数组的公倍数,一直做不出来(气死.jpg),卡了挺久的。
小谈一波
其实它为什么是这样子求出来的我也不知道哈哈哈,但是我发现之前真题的大数题目都是和什么约数倍数有关的,比如大数拆解为多个约数之类的东西,所以我当时就往这方面想了,至于很多人说的《中国剩余定理》麻了,这两天忙没时间我没看。
至于其他的题目大家可以去看其他的大佬的,签到题目我应该也做了,其他的真的不太会哈哈哈
答案解法可能不唯一,我的可能也不一定对,大家可以互相交流一下哈