Блог пользователя JasonMendoza2008

Автор JasonMendoza2008, история, 11 месяцев назад, По-английски

The problem goes like this:

You are given an integer array nums.

A nice permutation is defined as a permutation of any non-empty subset of nums such that the absolute difference between any two consecutive elements is exactly 1. A permutation of size 1 is considered nice by definition. A subset is any non-empty selection of elements from nums (regardless of order). A permutation of a subset is any reordering of the elements of a subset.

Your task is to compute the sum of all elements across all such nice permutations.

Since the total may be very large, output the result modulo $$$10^9 + 7$$$.


Input

  • An array nums of integers.
  • $$$1 \leq \text{nums.length} \leq 10^5$$$ (maybe no solution exists though ... I can't guarantee anything lol)
  • $$$0 \leq \text{nums}[i] \leq 10^5$$$ (maybe no solution exists though ... I can't guarantee anything lol)

Output

  • A single integer: the sum of all elements in all nice permutations of all non-empty subsets of nums, taken modulo $$$10^9 + 7$$$.

Examples

nums = [1, 2, 3]

  • [1], [2], [3], [1,2], [2,1], [2,3], [3,2], [1,2,3], [3,2,1] are all valid.
  • The sum is 34.
  • [1, 3], [3, 1], [2,3,1], [2,1,3], [3,1,2], and [1,3,2] are not valid.

nums = [2, 3, 2]

  • [2], [2], [3], [2,3], [3,2], [2,3], [3,2], [2,3,2], [2,3,2] are all valid.
  • The sum is 41.
  • [2,2], [2,2], [2,2,3], [2,2,3], [3,2,2], and [3,2,2] are not valid.

Apart from brute-forcing all $$$\sum_{k=1}^{n} \binom{n}{k} \cdot k!$$$ possibilities, I can't find any way to do it. I feel like we should start by sorting and making clusters (for example [1, 2, 9, 10, 11, 12] would have two clusters, [1, 2] and [9, 10, 11, 12]), but that kind of got me nowhere.

  • Проголосовать: нравится
  • +22
  • Проголосовать: не нравится

»
11 месяцев назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится

Very stupid question, but are all the elements distinct? Then it could be easier. With duplicates, it won't. Even counting the possible nice permutatiosn would be difficult then.

»
11 месяцев назад, скрыть # |
Rev. 3  
Проголосовать: нравится +3 Проголосовать: не нравится

I could thought of a solution of n*2^n...

if you choose an element as starting point and then do recursion to choose the -1 or +1 (if exists) then keep a sum tracker go on with it.

Then it may be solvable for n<=12

Also starting point are distinct so , if there are multpile same numbers we only have to choose the distinct ones.

»
11 месяцев назад, скрыть # |
Rev. 3  
Проголосовать: нравится -8 Проголосовать: не нравится

Okay, Jason, here's the solution for only distinct elements array in block form:

def solve(array):
    array.sort()
    the_one_having_nice_subarrays = []
    the_nice_subarrays = []

    for i in range(len(array) - 1):
        the_nice_subarrays.append(array[i])
        if array[i + 1] != array[i] + 1:
            the_one_having_nice_subarrays.append(the_nice_subarrays)
            the_nice_subarrays = []
    the_nice_subarrays.append(array[-1])
    the_one_having_nice_subarrays.append(the_nice_subarrays)

    MOD = 10 ** 9 + 7
    total_sum = 0

    for a_list in the_one_having_nice_subarrays:
        t = len(a_list)
        if t == 0:
            continue
        A = a_list[0]

        t2 = t * t
        t3 = t2 * t
        t4 = t3 * t

        term = (
            2 * t4
            + 4 * A * t3
            + 4 * t3
            + 12 * A * t2
            - 8 * t2
            - 4 * A * t
            + 2 * t
        ) // 12

        term %= MOD
        total_sum = (total_sum + term) % MOD

    return total_sum

Isn't this O(n log n)? And also, did the format myself this time. The formula is the large one which is spread over multiple lines for better vision.

  • »
    »
    11 месяцев назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится

    In the worst case, there is a possibility of (n*(n+1))/2 subarrays (after sorting), and you have put all such subarrays into "the_one_having_nice_subarray" and then you iterate over "the_one_having_nice_subarray". So there is definitely an n^2 factor in the time complexity. For example with [1,2,3,4] as input, "the_one_having_nice_subarray" will have 10 (=(4*(4+1))/2) subarrays in it.

»
11 месяцев назад, скрыть # |
 
Проголосовать: нравится +9 Проголосовать: не нравится

The problem has a solution.