<p>An integer <code>x</code> is <strong>numerically balanced</strong> if for every digit <code>d</code> in the number <code>x</code>, there are <strong>exactly</strong> <code>d</code> occurrences of that digit in <code>x</code>.</p>

<p>Given an integer <code>n</code>, return <em>the <strong>smallest numerically balanced</strong> number <strong>strictly greater</strong> than </em><code>n</code><em>.</em></p>

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

<pre>
<strong>Input:</strong> n = 1
<strong>Output:</strong> 22
<strong>Explanation:</strong> 
22 is numerically balanced since:
- The digit 2 occurs 2 times. 
It is also the smallest numerically balanced number strictly greater than 1.
</pre>

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

<pre>
<strong>Input:</strong> n = 1000
<strong>Output:</strong> 1333
<strong>Explanation:</strong> 
1333 is numerically balanced since:
- The digit 1 occurs 1 time.
- The digit 3 occurs 3 times. 
It is also the smallest numerically balanced number strictly greater than 1000.
Note that 1022 cannot be the answer because 0 appeared more than 0 times.
</pre>

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

<pre>
<strong>Input:</strong> n = 3000
<strong>Output:</strong> 3133
<strong>Explanation:</strong> 
3133 is numerically balanced since:
- The digit 1 occurs 1 time.
- The digit 3 occurs 3 times.
It is also the smallest numerically balanced number strictly greater than 3000.
</pre>

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

<ul>
	<li><code>0 &lt;= n &lt;= 10<sup>6</sup></code></li>
</ul>

class Solution:
    def nextBeautifulNumber(self, n: int) -> int:
        if n == 0:
            return 1
        def getNums(mask,places,vals):
            if places < 0:
                return 
            elif places == 0:
                vals.add(mask)
            else:
                for i in range(1,places+1):
                    cmask = 1 << i
                    if not(cmask & mask):
                        getNums(mask ^ cmask,places-i,vals)

        def solve(n):
            # calc the positions
            curr = 1
            pos = 0
            while curr <= n:
                pos+=1
                curr=curr*10

            #getting the numbers that can be used
            vals=set()
            getNums(0,pos,vals)
            getNums(0,pos+1,vals)
            values = set()
            res = float('inf')
            for num in vals:
                bin_val = bin(num).replace('0b','')[-1::-1]
                arr = []
                for i in range(len(bin_val)):
                    if bin_val[i]!='0':
                        for j in range(i):
                            arr.append(i)
                for p in permutations(arr):
                    s = ''
                    for k in p:
                        s+=str(k)
                    if int(s) > n and int(s) < res:
                        res = int(s)
            return res
        return solve(n)
        # return 2
1244