class Solution
{
public:
long long res = 0;
int dp[41][41];
long long nCr(int n, int r)
{
if (dp[n][r] != -1)
return dp[n][r];
long long sum = 1;
for (int i = 1; i <= r; i++)
{
sum = sum * (n - r + i) / i;
}
return dp[n][r] = sum;
}
void dfs(vector<int> &count, int index, int currentSum, int targetSum, int pendingEvenLength, int pendingOddLength, long long even, long long odd)
{
if (currentSum > targetSum || pendingEvenLength < 0 || pendingOddLength < 0)
return;
if (currentSum == targetSum && pendingEvenLength == 0 && pendingOddLength == 0)
{
res += (even * odd) % MOD;
res = res % MOD;
return;
}
if (index > 9)
return;
for (int i = 0; i <= count[index]; i++)
{
long long nextEven = (even * nCr(pendingEvenLength, i)) % MOD;
long long nextOdd = (odd * nCr(pendingOddLength, count[index] - i)) % MOD;
dfs(count, index + 1, currentSum + i * index, targetSum, pendingEvenLength - i, pendingOddLength + i - count[index], nextEven, nextOdd);
}
}
int countBalancedPermutations(string num)
{
int sum = 0;
vector<int> count(10, 0);
memset(dp, -1, sizeof(dp));
for (auto &i : num)
{
sum += (i - '0');
count[i - '0']++;
}
if (sum % 2)
return 0;
dfs(count, 0, 0, sum / 2, num.size() / 2, num.size() - num.size() / 2, 1, 1);
return res;
}
};