Python:每日一题 392
本帖最后由 永恒的蓝色梦想 于 2020-5-25 17:51 编辑今天的题目:
函数 f(a,b) 递归定义如下:
f(a,1)=a
f(a,b)=af(a,b-1)
有 正整数 n,将 n 平分成 k 份,定义 m(n) 为 (n/k)k 的最大值。
如果 m(n) 为无限小数,则 d(n)=f(k,n) 的最后 6 位,否则 d(n)=-f(k,n) 的最后 7 位。
编写函数 S(a,b),求 5 ≤ a ≤ n ≤ b ≤ 100 时,所有 d(n) 的和。
{:10_298:}欢迎大家一起答题!{:10_298:} 占个楼看看会不会做{:10_254:} 本帖最后由 March2615 于 2020-5-13 19:51 编辑
题目中的f(a,b)=a^f(a, k-1),k是啥呀
定义 m(n) 为 (n/k)^p 的最大值,p又是啥呀 本帖最后由 TJBEST 于 2020-5-13 19:51 编辑
前排,后面补充 不过你的字母是不是有点问题?前后对不上
@永恒的蓝色梦想 您这个是欧拉计划183题吗?
(我就是记得看到过挺像的,专门去找了一下) 函数 f(a,b) 递归定义如下:
f(a,1)=a
f(a,b)=af(a,k-1)
K是怎么定义的 函数 f(a,b) 递归定义如下:
f(a,1)=a
f(a,b)=af(a,b-1)
是不是应该这么定义
就只有我自己读不懂题么 本帖最后由 March2615 于 2020-5-13 21:53 编辑
再多嘴问一句
编写函数S(a, b)啊n不是有范围了嘛 为什么还需要传入这个参数
(今天这题太绕太难了,我已经大概率知道我做不出来了,如果可以的话请把我这几层删掉{:10_266:}) 本帖最后由 永恒的蓝色梦想 于 2020-5-13 22:01 编辑
March2615 发表于 2020-5-13 21:49
再多嘴问一句,最后是不是 编写函数S(a, b)啊n不是有范围了嘛 为什么还需要传入这个参数
(我已 ...
非常抱歉……我谢罪{:10_266:} March2615 发表于 2020-5-13 21:49
再多嘴问一句
编写函数S(a, b)啊n不是有范围了嘛 为什么还需要传入这个参数
这道题是 mix 的 Project Euler 183 和 188,然后改编的。
有兴趣的话,可以看一下我在这两道题下的评论 本帖最后由 咸鱼c1 于 2020-5-14 13:12 编辑
刚刚开始学python,不知道做的对不对{:5_109:}
def pow(x,n):
ret=1
while n>0:
ret*=x
ret=ret%1e7
n-=1
return ret
def gcd(a,b):
while True:
c=a%b
a=b
b=c
if b==0:
return a
def f(a,b):
if b==1:
return a
else:
return pow(a,f(a,b-1))%1e7
def m(n):
max_m=-1
for i in range(1,n+1):
temp=pow(n/i,i)
if temp>max_m:
max_m=temp
ret=i
c=gcd(n,ret)
i=ret/c
while i%2==0 :
i/=2
while i%5==0 :
i/=5
if i!=1:
i=0
return ret,max_m,i
def S(n,a,b):
s=0
for i in range(a,b+1):
temp=m(i)
if(temp==1):
s+=-f(temp,i)%1e7
else:
s+=f(temp,i)%1e6
return s 领取鱼币学习 zhouzhouda 发表于 2020-5-14 10:18
领取鱼币学习
很抱歉,这里不是发鱼币的 本帖最后由 March2615 于 2020-5-15 13:37 编辑
from math import e
def m(n: int) -> tuple:
"""
取f(x) = (n/x)^x 的最大值,求导可知 x = n / e 时取到。
比较int(n/e)和int(n/e)+1的值即可
判断(n/k)^k是否是无限小数 -> 判断n/k是否是无限小数 -> k是不是2或者5的倍数
:param n:
:return: 切割的份数 以及 (n/k)^k 是否为无限小数(k, flag)
"""
x = int(n / e)
k = x if pow(n / x, x) > pow(n / (x + 1), x + 1) else x + 1
flag = True
if k % 5 and k % 2:
flag = False
return k, flag
def f(k, n, flag):# 超幂 超出数字范围了
# 参考欧拉计划188,发现可以每一步都取余,这样就不会超范围了
num = 1000000 if flag else 10000000
if n == 1:
return k % num
return pow(k, f(k, n - 1, flag), num)
def s(a: int, b: int) -> int:
res = 0
for i in range(a, b + 1):
k, flag = m(i)
res = res + f(k, i, flag) if flag else res - f(k, i, flag)# 否则 d(n)=-f(k,n) 的最后7位 -- 不知道该不该带符号
return res
if __name__ == '__main__':
print(m(8))
print(s(8, 8))
大概就是这样吧,不知道了
——————————————————————————————————————————————————————
0515 13:35修改,原m(n)部分考虑不周,无限小数判断错误
def m(n: int) -> tuple:
"""
取f(x) = (n/x)^x 的最大值,求导可知 x = n / e 时取到。
比较int(n/e)和int(n/e)+1的值即可
判断(n/k)^k是否是无限小数 -> 判断n/k是否是无限小数
-> k = 2^p * 5^q (p, q >= 0) 时为有限小数
:param n:
:return: 切割的份数 以及 (n/k)^k 是否为有限小数(k, flag)
"""
x = int(n / e)
k = x if pow(n / x, x) > pow(n / (x + 1), x + 1) else x + 1
def iint(k: int) -> bool:
while k // 2 == 0:
k //= 2
while k // 5 == 0:
k //= 5
return k == 1
return k, iint(k) 回复每日一题有鱼币吗
March2615 发表于 2020-5-14 12:25
大概就是这样吧,不知道了
k如果是n/e的话,那是不是都是无限小数了{:5_97:} 咸鱼c1 发表于 2020-5-14 13:05
k如果是n/e的话,那是不是都是无限小数了
x = int(n / e) 了呀,k在x和x+1里面选结果较大的 瞪眼雄 发表于 2020-5-14 13:05
回复每日一题有鱼币吗
做题才有。