|
| 1 | +class Solution(object): |
| 2 | + def countBalancedPermutations(self, num): |
| 3 | + mod = 10**9+7 |
| 4 | + n = len(num) |
| 5 | + total = sum(int(c) for c in num) |
| 6 | + if total % 2: return 0 |
| 7 | + fact = [1]*(n+1) |
| 8 | + inv = [1]*(n+1) |
| 9 | + invFact = [1]*(n+1) |
| 10 | + for i in range(1,n+1): fact[i] = fact[i-1]*i % mod |
| 11 | + for i in range(2,n+1): inv[i] = mod - (mod//i)*inv[mod%i] % mod |
| 12 | + for i in range(1,n+1): invFact[i] = invFact[i-1]*inv[i] % mod |
| 13 | + halfSum = total//2 |
| 14 | + halfLen = n//2 |
| 15 | + dp = [[0]*(halfLen+1) for _ in range(halfSum+1)] |
| 16 | + dp[0][0] = 1 |
| 17 | + digits = [0]*10 |
| 18 | + for c in num: |
| 19 | + d = int(c) |
| 20 | + digits[d] += 1 |
| 21 | + for i in range(halfSum, d-1, -1): |
| 22 | + for j in range(halfLen, 0, -1): |
| 23 | + dp[i][j] = (dp[i][j] + dp[i-d][j-1]) % mod |
| 24 | + res = dp[halfSum][halfLen] |
| 25 | + res = res * fact[halfLen] % mod * fact[n-halfLen] % mod |
| 26 | + for cnt in digits: res = res * invFact[cnt] % mod |
| 27 | + return res |
0 commit comments