Rule of League (Codeforces 1733B)
Tags: Math, constructive algorithms

There is a badminton championship in which $$$n$$$ players take part. The players are numbered from $$$1$$$ to $$$n$$$. The championship proceeds as follows: player $$$1$$$ and player $$$2$$$ play a game, then the winner and player $$$3$$$ play a game, and then the winner and player $$$4$$$ play a game, and so on. So, $$$n-1$$$ games are played, and the winner of the last game becomes the champion. There are no draws in the games.You want to find out the result of championship. Currently, you only know the following information:  Each player has either won $$$x$$$ games or $$$y$$$ games in the championship. Given $$$n$$$, $$$x$$$, and $$$y$$$, find out if there is a result that matches this information.

Input: The first line contains one integer $$$t$$$ ($$$1 \le t \le 10^5$$$) — the number of test cases.The only line of each test case contains three integers $$$n$$$, $$$x$$$, $$$y$$$ ($$$2 \le n \le 10^5$$$, $$$0 \le x, y < n$$$).It is guaranteed that the sum of $$$n$$$ over all test cases doesn't exceed $$$2 \cdot 10^5$$$.

Output: Print the answer for each test case, one per line. If there is no result that matches the given information about $$$n$$$, $$$x$$$, $$$y$$$, print $$$-1$$$. Otherwise, print $$$n-1$$$ space separated integers, where the $$$i$$$-th integer is the player number of the winner of the $$$i$$$-th game. If there are multiple valid results, print any.

Note: In the first test case, player $$$1$$$ and player $$$4$$$ won $$$x$$$ times, player $$$2$$$ and player $$$3$$$ won $$$y$$$ times.In the second, third, and fifth test cases, no valid result exists.

Sample Inputs:
5
5 2 0
8 1 2
3 0 0
2 0 1
6 3 0

Sample Outputs:
1 1 4 4
-1
-1
2 
-1

Solution (Python):
for s in [*open(0)][1:]:
    (n, x, y) = map(int, s.split())
    z = x or y
    print(*(z > x * y < 1 > (n - 1) % z and [z * f'{i} ' for i in range(2, n + 1, z)] or [-1]))

Solution (Python):
for s in [*open(0)][1:]:
    (n, x, y) = map(int, s.split())
    z = x or y
    print(*(z > x * y < 1 > (n - 1) % z and [z * f'{i} ' for i in range(2, n + 1, z)] or [-1]))

Solution (Python):
def solve():
    (n, x, y) = [int(i) for i in input().split()]
    if x >= 1 and y >= 1 or (x == 0 and y == 0):
        return -1
    if y == 0:
        if (n - 1) % x == 0:
            ans = ''
            q = 2
            for i in range((n - 1) // x):
                ans += f'{q} ' * x
                q += x
            return ans
        return -1
    if x == 0:
        if (n - 1) % y == 0:
            ans = ''
            q = 2
            for i in range((n - 1) // y):
                ans += f'{q} ' * y
                q += y
            return ans
        return -1
    return -1
t = int(input())
ans = []
while t:
    ans.append(str(solve()))
    t -= 1
print('\n'.join(ans))