永恒的蓝色梦想 发表于 2020-5-13 17:26:27

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:}

Twilight6 发表于 2020-5-13 17:28:32

占个楼看看会不会做{:10_254:}

March2615 发表于 2020-5-13 19:48:02

本帖最后由 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:48:36

本帖最后由 TJBEST 于 2020-5-13 19:51 编辑

前排,后面补充

TJBEST 发表于 2020-5-13 19:52:11

不过你的字母是不是有点问题?前后对不上
@永恒的蓝色梦想

March2615 发表于 2020-5-13 20:26:49

您这个是欧拉计划183题吗?
(我就是记得看到过挺像的,专门去找了一下)

helenaywu 发表于 2020-5-13 21:42:47

函数 f(a,b) 递归定义如下:
f(a,1)=a
f(a,b)=af(a,k-1)
K是怎么定义的

helenaywu 发表于 2020-5-13 21:43:26

函数 f(a,b) 递归定义如下:
f(a,1)=a
f(a,b)=af(a,b-1)
是不是应该这么定义

helenaywu 发表于 2020-5-13 21:49:09

就只有我自己读不懂题么

March2615 发表于 2020-5-13 21:49:52

本帖最后由 March2615 于 2020-5-13 21:53 编辑

再多嘴问一句

编写函数S(a, b)啊n不是有范围了嘛 为什么还需要传入这个参数

(今天这题太绕太难了,我已经大概率知道我做不出来了,如果可以的话请把我这几层删掉{:10_266:})

永恒的蓝色梦想 发表于 2020-5-13 21:52:45

本帖最后由 永恒的蓝色梦想 于 2020-5-13 22:01 编辑

March2615 发表于 2020-5-13 21:49
再多嘴问一句,最后是不是   编写函数S(a, b)啊n不是有范围了嘛 为什么还需要传入这个参数
(我已 ...

非常抱歉……我谢罪{:10_266:}

永恒的蓝色梦想 发表于 2020-5-13 21:57:07

March2615 发表于 2020-5-13 21:49
再多嘴问一句

编写函数S(a, b)啊n不是有范围了嘛 为什么还需要传入这个参数


这道题是 mix 的 Project Euler 183 和 188,然后改编的。
有兴趣的话,可以看一下我在这两道题下的评论

咸鱼c1 发表于 2020-5-13 23:22:54

本帖最后由 咸鱼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:48

领取鱼币学习

永恒的蓝色梦想 发表于 2020-5-14 10:20:57

zhouzhouda 发表于 2020-5-14 10:18
领取鱼币学习

很抱歉,这里不是发鱼币的

March2615 发表于 2020-5-14 12:25:23

本帖最后由 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)

瞪眼雄 发表于 2020-5-14 13:05:04

回复每日一题有鱼币吗

咸鱼c1 发表于 2020-5-14 13:05:10

March2615 发表于 2020-5-14 12:25
大概就是这样吧,不知道了

k如果是n/e的话,那是不是都是无限小数了{:5_97:}

March2615 发表于 2020-5-14 13:18:42

咸鱼c1 发表于 2020-5-14 13:05
k如果是n/e的话,那是不是都是无限小数了

x = int(n / e) 了呀,k在x和x+1里面选结果较大的

永恒的蓝色梦想 发表于 2020-5-14 13:25:50

瞪眼雄 发表于 2020-5-14 13:05
回复每日一题有鱼币吗

做题才有。
页: [1] 2 3
查看完整版本: Python:每日一题 392