Permutation (Codeforces 1701B)
Tags: Greedy, greedy

Recall that a permutation of length $$$n$$$ is an array where each element from $$$1$$$ to $$$n$$$ occurs exactly once.For a fixed positive integer $$$d$$$, let's define the cost of the permutation $$$p$$$ of length $$$n$$$ as the number of indices $$$i$$$ $$$(1 \le i < n)$$$ such that $$$p_i \cdot d = p_{i + 1}$$$.For example, if $$$d = 3$$$ and $$$p = [5, 2, 6, 7, 1, 3, 4]$$$, then the cost of such a permutation is $$$2$$$, because $$$p_2 \cdot 3 = p_3$$$ and $$$p_5 \cdot 3 = p_6$$$.Your task is the following one: for a given value $$$n$$$, find the permutation of length $$$n$$$ and the value $$$d$$$ with maximum possible cost (over all ways to choose the permutation and $$$d$$$). If there are multiple answers, then print any of them.

Input: The first line contains a single integer $$$t$$$ ($$$1 \le t \le 500$$$) — the number of test cases.The single line of each test case contains a single integer $$$n$$$ ($$$2 \le n \le 2 \cdot 10^5$$$).The sum of $$$n$$$ over all test cases does not exceed $$$2 \cdot 10^5$$$.

Output: For each test case, print the value $$$d$$$ in the first line, and $$$n$$$ integers in the second line — the permutation itself. If there are multiple answers, then print any of them.


Sample Inputs:
2
2
3

Sample Outputs:
2
1 2
3
2 1 3

Solution (Python):
""""""

def i():
    n = int(input())
    half = n // 2
    if half % 2:
        c = [str(x) for x in range(half + 2, n + 1, 2)]
    else:
        c = [str(x) for x in range(half + 1, n + 1, 2)]
    s = [x for x in range(1, half + 1, 2)]
    for p in s:
        c.append(str(p))
        j = p * 2
        while j <= n:
            c.append(str(j))
            j *= 2
    print('2\n' + ' '.join(c))
t = int(input())
for _ in range(t):
    i()

Solution (Python):
for _ in range(int(input())):
    n = int(input())
    list1 = []
    for num in range(1, n + 1, 2):
        while num <= n:
            list1.append(num)
            num *= 2
    print(2)
    print(' '.join(map(str, list1)))

Solution (Python):
from sys import stdin
input = stdin.readline
for _ in range(int(input())):
    n = int(input())
    print(2)
    ans = []
    for i in range(1, n + 1, 2):
        while i <= n:
            ans.append(i)
            i *= 2
    print(' '.join(map(str, ans)))