Sum on Subarrays (Codeforces 1809C)
Tags: Math, constructive algorithms

For an array $$$a = [a_1, a_2, \dots, a_n]$$$, let's denote its subarray $$$a[l, r]$$$ as the array $$$[a_l, a_{l+1}, \dots, a_r]$$$.For example, the array $$$a = [1, -3, 1]$$$ has $$$6$$$ non-empty subarrays:  $$$a[1,1] = [1]$$$;  $$$a[1,2] = [1,-3]$$$;  $$$a[1,3] = [1,-3,1]$$$;  $$$a[2,2] = [-3]$$$;  $$$a[2,3] = [-3,1]$$$;  $$$a[3,3] = [1]$$$. You are given two integers $$$n$$$ and $$$k$$$. Construct an array $$$a$$$ consisting of $$$n$$$ integers such that:  all elements of $$$a$$$ are from $$$-1000$$$ to $$$1000$$$;  $$$a$$$ has exactly $$$k$$$ subarrays with positive sums;  the rest $$$\dfrac{(n+1) \cdot n}{2}-k$$$ subarrays of $$$a$$$ have negative sums. 

Input: The first line contains one integer $$$t$$$ ($$$1 \le t \le 5000$$$) — the number of test cases.Each test case consists of one line containing two integers $$$n$$$ and $$$k$$$ ($$$2 \le n \le 30$$$; $$$0 \le k \le \dfrac{(n+1) \cdot n}{2}$$$).

Output: For each test case, print $$$n$$$ integers — the elements of the array meeting the constraints. It can be shown that the answer always exists. If there are multiple answers, print any of them.


Sample Inputs:
4
3 2
2 0
2 2
4 6

Sample Outputs:
1 -3 1
-13 -42
-13 42
-3 -4 10 -2

Solution (Python):
def solve(n, k):
    res = [-1000] * n
    if k == 0:
        return ' '.join(map(str, res))
    for i in range(n):
        possible = (i + 1) * (i + 2) // 2
        res[i] = 2
        if possible == k:
            break
        if k - possible <= i + 1:
            if k - possible == i + 1:
                res[i + 1] = -1
            else:
                x = 2 * (i + 1) + 1
                x -= 2 * (k - possible)
                res[i + 1] = -x
            break
    return ' '.join(map(str, res))
for _ in range(int(input())):
    (n, k) = list(map(int, input().split()))
    print(solve(n, k))

Solution (Python):
def solve(n, k):
    res = [-1000] * n
    if k == 0:
        return ' '.join(map(str, res))
    for i in range(n):
        possible = (i + 1) * (i + 2) // 2
        res[i] = 2
        if possible == k:
            break
        if k - possible <= i + 1:
            if k - possible == i + 1:
                res[i + 1] = -1
            else:
                x = 2 * (i + 1) + 1
                x -= 2 * (k - possible)
                res[i + 1] = -x
            break
    return ' '.join(map(str, res))
for _ in range(int(input())):
    (n, k) = list(map(int, input().split()))
    print(solve(n, k))

Solution (Python):
def mani(n, k):
    val = [-1000] * n
    if k == 0:
        return ' '.join(map(str, val))
    for i in range(n):
        nums = (i + 1) * (i + 2) // 2
        val[i] = 2
        if nums == k:
            break
        if k - nums <= i + 1:
            if k - nums == i + 1:
                val[i + 1] = -1
            else:
                x = 2 * (i + 1) + 1
                x -= 2 * (k - nums)
                val[i + 1] = -x
            break
    return ' '.join(map(str, val))
for _ in range(int(input())):
    (n, k) = list(map(int, input().split()))
    print(mani(n, k))
for i in range(30):
    continue