I Wanna Beat the Joke
我们定义f(n)为前n个数中关系左侧首次出现的数的数量。
可得f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 3。
以n=4为例,前四个数中首次出现的是1、2、3,而4并非首次出现
(因为n = 1时1 ⊨ 4已经出现4)。
易知题目所求即为2 * f(n)。
可以得到递推关系:f(n) = 总数 - 非首次出现的数 = n - f(n / 4)。
“非首次出现的数”为f(n / 4)是因为这些数都是之前“首次出现的数”乘 4 得到的。
f(n)可以通过递归或者迭代实现计算,时间复杂度为log(n)。
递归:
def f(x):
if x == 0:
return 0
return x - f(x // 4)
for _ in range(int(input())):
n = int(input())
print(2 * f(n))
迭代:
def f(x):
op = 1
res = 0
while x:
if op:
res += x
else:
res -= x
x >>= 2
op ^= 1
return res
for _ in range(int(input())):
n = int(input())
print(2 * f(n))