前言:
这次国赛还是比较难的,只有两道填空而且都是大量计算用时一个小时,第二道写完了但还最后还差10分组跑出结果心态崩了...不过最后两道大题还是较为容易ak的,可能是官方给个体面分吧
思路经供参考,在网上找了下没有几篇文章,填空题最终得到的结果也得不到验证就不写出了
目录:
填空题
斐波那契与7
题目:
思路:
一开始看到这么多项就知道肯定是不能硬跑的,哪怕只取末尾运算也难以得到结果。然后就针对末尾项找规律。因为dp[n]的结果只与前两项有关,只要前两项的末位数的顺序之前出现过,那么这个区间就是重复区间。然后找到每隔60项为一周期,这里面有8个7
代码:
dp=[1 for _ in range(3)]
chucun=[[1,1]]
res=0
for i in range(70):
dp[2]=dp[1]+dp[0]
# 这里的项数实质从3开始
print(i,dp[2])
s=str(dp[2])
if s[-1]=='7':
res += 1
s2,s3,s4=str(dp[2]),str(dp[1]),str(dp[0])
if [s4,s3] in chucun:
print(s4,s3)
break
else:
chucun.append([s4,s3])
#print(s4,s3)
# 只取尾数,方便计算
dp[1],dp[0]=int(s2[-1]),int(s3[-1])
print(res)
答案:
小蓝做实验
题目:
思路:
这题只能暴力跑了,不过能做一些优化
1.观察所有数据可以发现,位数都是1,3,5,7,9。位数为5的数字全部去掉,可以删去四分之一的数据
2.采用6的余数法,原理就不阐述了,结论是一个质数除余6,结果必然为1或者5
3.在2的基础上,遍历时可以再做两点优化,遍历最大值为根号下该数字,和步长为2,跳过所有偶数
只能想到这几点优化,不过最后跑起来还是要命,jupyter大概二十分钟出结果,但比赛时用官方给的编辑器跑了将近一小时还没,最后无奈放弃
代码:
def zhishu(num):
if num%6!=1 and num%6!=5:
return False
for i in range(3,int(num**0.5)+1,2):
if num%i==0:
return False
return True
nums=[]
res=0
with open('primes.txt') as fp:
for line in fp.readlines():
nums.append(list(line.strip()))
nums2=[]
# 删去尾数为5的数据
for i in range(len(nums)):
nums[i]=''.join(nums[i])
if str(nums[i])[-1]=='5':
continue
nums2.append(nums[i])
print(len(nums2))
for i in range(len(nums2)):
print(i)
if zhishu(int(nums2[i])):
res += 1
print(res)
答案:
编程题
取模
题目: