class Solution:
def countBalancedPermutations(self, num: str) -> int:
digits_freq = [0] * 10
for c in num:
digits_freq[ord(c) - ord('0')] += 1
s = 0
for i in range(10):
s += i * digits_freq[i]
if s & 1:
return 0
MOD = 10**9 + 7
@lru_cache(None)
def c(n, k):
if k == 0:
return 1
if n == k:
return 1
else:
return (c(n-1, k-1) + c(n-1, k)) % MOD
@lru_cache(None)
def dp(d, diff, n_even, n_odd):
if n_even < 0 or n_odd < 0:
return 0
if d == -1:
return 1 if diff == 0 else 0
res = 0
for e in range(digits_freq[d] + 1):
remain_even = n_even-e
remain_odd = n_odd-(digits_freq[d]-e)
if remain_even < 0 or remain_odd < 0:
continue
temp = dp(d-1, diff + e*d - (digits_freq[d]-e)*d, remain_even, remain_odd)
temp = (temp * c(n_even, e) * c(n_odd, digits_freq[d]-e)) % MOD
res = (res + temp) % MOD
return res
return dp(9, 0, (len(num) + 1) // 2, len(num) // 2)