解题思路:
很难受这个题我写不出能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语言训练-求矩阵的两对角线上的元素之和 (C语言代码)浏览:3472 |
C语言程序设计教程(第三版)课后习题5.7 (C++代码)浏览:879 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:723 |
WU-整除问题 (C++代码)浏览:648 |
【计算球体积】 (C语言代码)浏览:1158 |
求圆的面积 (C语言代码)浏览:1756 |
a+b浏览:452 |
文科生的悲哀 (C语言代码)浏览:1538 |
数对 (C语言代码)浏览:762 |
sizeof的大作用 (C语言代码)浏览:1591 |