解题思路:
很难受这个题我写不出能AC的代码,一部分是因为PYTHON的特性,一部分是我太菜了,下方这个代码是我学习仿照C++栏中CtrlCV工程师老哥的代码,这个
思路我是完全想不到,勉强看懂了自己恐怕也写不出来,有没有大佬还能优化以下代码让我效率高一点,别超时了,万一比赛时遇到此类情况咋办啊,哭死。
注意事项:
参考代码:
a,b=map(int,input().split())
f = [0]*(5000001)#默认最小质因数的幂数为0
prime = [0]*(5000001)#质数数组
div = [0]*(5000001)#约数数量
ans = 1
t=0
for i in range(2,(b+1)):
if not f[i] :#如果为质数,则将其添加进质数数组并将f赋为2,约数数量为1和本身,即为2
t+=1
prime[t]=i
f[i]=2
div[i]=2
for j in range(1,t+1):#此处原理来自欧式筛法,即利用各个质数将其与其他数的乘积设为合数(欧式筛法确保每个数值被处理一次,无浪费)
if i*prime[j]>b:
break
if(i%prime[j]==0):#若该质数为i的最小质因数,则进行以下处理
f[i*prime[j]]=f[i]+1#f[i*prime[j]]为最小质因数的幂f[i]+1
#print('f[%d*%d]=f[%d]+1'% (i , prime[j],i))
div[i*prime[j]]=div[i]/f[i]*f[i*prime[j]]#公式为div(b)=div(a)/(a的最小质因数幂数+1)*(a的最小质因数幂数+2)
break
else:
f[i * prime[j]] = 2#最小质因数的次方+1
#print('f[%d*%d]=2' % (i, prime[j]))
div[i * prime[j]] = div[i] * 2#对于div[i * prime[j]] 与div[i],其共同最小质因数实际为prime[j],可以观察到[i]中并不包含
#v[i * prime[j]]中的prime[j],而prime[j]又是最小质因子,因此i的prime[j]的幂数为0,i * prime[j]的幂数为1,
# 再根据公式统一+1。因此此处固定为2
if(i>=a):ans=max(ans,div[i])
print(int(ans))
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复