C. Alya and Permutation(python解)-codeforces
C. Alya and Permutation(python解)
原题链接:
问题分析:
给定一个整数 n,我们需要构造一个包含 1,2,…,n的排列 p,通过特定的运算使得一个初始值为 0 的变量 k 达到最大。
对于于每一个 i 从 1 到 n:
如果 i 是奇数,则执行:
k = k & p**i
如果 ii 是偶数,则执行:
k = k | p**i
我们的目标是找到一个排列 p,使得运算结束时 k 的值尽可能大
思路:
在这个问题中,我们可以通过合理设置最后 5 个元素来控制 k 的值。我们可以将问题分成两种情况处理:n 为奇数和偶数。
代码:
def main():
import sys
input = sys.stdin.read
data = input().split()
t = int(data[0])
index = 1
results = []
for _ in range(t):
n = int(data[index])
index += 1
s = set(range(1, n + 1))
a = [0] * (n + 1)
po2 = 1
while po2 * 2 <= n:
po2 *= 2
if n % 2 == 1:
results.append(n)
low = n & (-n)
a[n - 3] = low
a[n - 2] = low + (2 if low == 1 else 1)
a[n - 1] = n - low
a[n] = n
else:
results.append(po2 * 2 - 1)
if n == po2:
a[n - 4] = 1
a[n - 3] = 3
a[n - 2] = n - 2
a[n - 1] = n - 1
a[n] = n
else:
a[n - 2] = n
a[n - 1] = n - 1
a[n] = po2 - 1
for i in range(1, n + 1):
if a[i] in s:
s.remove(a[i])
for i in range(1, n + 1):
if a[i] == 0:
a[i] = s.pop()
results.append(' '.join(map(str, a[1:])))
print('\n'.join(map(str, results)))
main()