Anti-knapsack (Codeforces 1493A)
Tags: Greedy, constructive algorithms

You are given two integers $$$n$$$ and $$$k$$$. You are asked to choose maximum number of distinct integers from $$$1$$$ to $$$n$$$ so that there is no subset of chosen numbers with sum equal to $$$k$$$.A subset of a set is a set that can be obtained from initial one by removing some (possibly all or none) elements of it.

Input: The first line contains the number of test cases $$$T$$$ ($$$1 \le T \le 100$$$).Each of the next $$$T$$$ lines contains two integers $$$n$$$ and $$$k$$$ ($$$1 \le k \le n \le 1000$$$) — the description of test cases.

Output: For each test case output two lines. In the first line output a single integer $$$m$$$ — the number of chosen integers.In the second line output $$$m$$$ distinct integers from $$$1$$$ to $$$n$$$ — the chosen numbers.If there are multiple answers, print any. You can print the numbers in any order.


Sample Inputs:
3
3 2
5 3
1 1

Sample Outputs:
2
3 1 
3
4 5 2 
0

Solution (Python):
t = int(input())
for i in range(t):
    (n, k) = map(int, input().split())
    a = [str(j) for j in range(k // 2 + k % 2, k)]
    a += [str(j) for j in range(k + 1, n + 1)]
    print(len(a))
    print(' '.join(a))

Solution (Python):
for _ in range(int(input())):
    (a, b) = map(int, input().split())
    c = ''
    d = 0
    for i in range(b + 1, a + 1):
        c += str(i) + ' '
        d += 1
    for i in range(1, b // 2 + 1):
        c += str(b - i) + ' '
        d += 1
    print(d)
    print(c)

Solution (Python):
for s in [*open(0)][1:]:
    (n, k) = map(int, s.split())
    print(n - k + k // 2, *range(k + 1 >> 1, k), *range(k + 1, n + 1))