假设我们有一个数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