在Python中以给定的单调序列查找元素位置

假设我们有一个数l和一个单调递增序列f(m),其中f(m)= am + bm [log2(m)] + cm ^ 3和(a = 1,2,3,…),(b = 1,2,3,…),(c = 0,1,2,3,…)

这里[log2(m)]是以2为底的对数,并将该值四舍五入。所以,

如果m = 1,则值为0。

如果m = 2-3,则值为1。

如果m = 4-7,则值为2。

如果m = 8-15,则值为3。依此类推

我们必须找到值m,使f(m)= l,如果序列中不存在l,则必须打印0。我们必须牢记,值是以这样的方式表示的: 64位以及三个整数a,b和c小于或等于100。

因此,如果输入像a = 2,b = 1,c = 1,l = 12168587437017,则输出将为23001,因为f(23001)= 12168587437017

为了解决这个问题,我们将遵循以下步骤-

  • SMALLER_VAL:= 1000000

  • LARGER_VAL:= 1000000000000000

  • 定义一个功能solve()。这将需要a,b,c,n

  • 回答:= a * n

  • lg_val:= n的日志基数2的下限

  • ans:= ans + b * n * lg_val

  • ans:= ans + c * n ^ 3

  • 返回ans

  • 从主要方法中,执行以下操作-

  • 开始:= 1

  • 结束:= SMALLER_VAL

  • 如果c与0相同,则

    • 结束:= LARGER_VAL

  • 回答:= 0

  • 在开始<=结束时,执行

    • 开始:=中+ 1

    • 结束:=中-1

    • ans:=中

    • 从循环中出来

    • 中:=(开始+结束)/ 2(仅取整数部分)

    • val:= solve(a,b,c,mid)

    • 如果val与k相同,则

    • 否则当val> k时

    • 除此以外,

    • 返回ans

    示例

    让我们看下面的实现以更好地理解-

    from math import log2, floor
    SMALLER_VAL = 1000000
    LARGER_VAL = 1000000000000000
    def solve(a, b, c, n) :
       ans = a * n
       lg_val = floor(log2(n))
       ans += b * n * lg_val
       ans += c * n**3
       return ans
    def get_pos(a, b, c, k) :
       begin = 1
       end = SMALLER_VAL
       if (c == 0) :
          end = LARGER_VAL
       ans = 0
       while (begin <= end) :
          mid = (begin + end) // 2
          val = solve(a, b, c, mid)
          if (val == k) :
             ans = mid
             break
          elif (val > k) :
             end = mid - 1
          else :
             begin = mid + 1
       return ans
    a = 2
    b = 1
    c = 1
    k = 12168587437017
    print(get_pos(a, b, c, k))

    输入项

    2,1,1,12168587437017

    输出结果

    23001
    猜你喜欢