<p>You are given an array of non-negative integers <code>nums</code> and an integer <code>k</code>. In one operation, you may choose <strong>any</strong> element from <code>nums</code> and <strong>increment</strong> it by <code>1</code>.</p>

<p>Return<em> the <strong>maximum</strong> <strong>product</strong> of </em><code>nums</code><em> after <strong>at most</strong> </em><code>k</code><em> operations. </em>Since the answer may be very large, return it <b>modulo</b> <code>10<sup>9</sup> + 7</code>. Note that you should maximize the product before taking the modulo.&nbsp;</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [0,4], k = 5
<strong>Output:</strong> 20
<strong>Explanation:</strong> Increment the first number 5 times.
Now nums = [5, 4], with a product of 5 * 4 = 20.
It can be shown that 20 is maximum product possible, so we return 20.
Note that there may be other ways to increment nums to have the maximum product.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [6,3,3,2], k = 2
<strong>Output:</strong> 216
<strong>Explanation:</strong> Increment the second number 1 time and increment the fourth number 1 time.
Now nums = [6, 4, 3, 3], with a product of 6 * 4 * 3 * 3 = 216.
It can be shown that 216 is maximum product possible, so we return 216.
Note that there may be other ways to increment nums to have the maximum product.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length, k &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= nums[i] &lt;= 10<sup>6</sup></code></li>
</ul>

class Solution:
    def maximumProduct(self, nums: List[int], k: int) -> int:
        curr_k = 0
        curr_i = 0
        nums.sort()
        print(k)
        while k:
            if curr_i == len(nums)-1:
                curr_k = k
            else:
                curr_k = (nums[curr_i+1] - nums[curr_i]) * (curr_i+1)
            # print(k, curr_i, nums, curr_k)
            if k > curr_k and curr_k != 0 and nums[curr_i+1] != nums[curr_i]:
                to_each_curr = curr_k // (curr_i+1)
                for item in range(curr_i+1):
                    nums[item] += to_each_curr
                k = k-(to_each_curr*(curr_i+1))
            elif k // (curr_i+1) > 0 and k != 1 and curr_i != len(nums)-1 and nums[curr_i+1] != nums[curr_i]:
                to_each_curr = k // (curr_i+1)
                for item in range(curr_i+1):
                    nums[item] += to_each_curr
                k = k - to_each_curr*(curr_i+1)
            
            elif curr_i != len(nums)-1 and nums[curr_i+1] == nums[curr_i]:
                pass
            else:
                to_each_curr = 1
                for item in range(curr_i+1):
                    if k == 0:
                        break
                    nums[item] += to_each_curr
                    k -= 1
            curr_i = curr_i + 1 if len(nums) - 1 >= curr_i+1 else len(nums)-1
        # print(nums)
        product = 1
        for item in nums:
            product = (product*item) % (10**9+7)
        
        return product 
798