2025-05-09 Daily Challenge
Today I have done leetcode's May LeetCoding Challenge with cpp
.
May LeetCoding Challenge 9
Description
Count Number of Balanced Permutations
You are given a string num
. A string of digits is called balanced if the sum of the digits at even indices is equal to the sum of the digits at odd indices.
Return the number of distinct permutations of num
that are balanced.
Since the answer may be very large, return it modulo 109 + 7
.
A permutation is a rearrangement of all the characters of a string.
Example 1:
Input: num = "123"
Output: 2
Explanation:
- The distinct permutations of
num
are"123"
,"132"
,"213"
,"231"
,"312"
and"321"
. - Among them,
"132"
and"231"
are balanced. Thus, the answer is 2.
Example 2:
Input: num = "112"
Output: 1
Explanation:
- The distinct permutations of
num
are"112"
,"121"
, and"211"
. - Only
"121"
is balanced. Thus, the answer is 1.
Example 3:
Input: num = "12345"
Output: 0
Explanation:
- None of the permutations of
num
are balanced, so the answer is 0.
Constraints:
2 <= num.length <= 80
num
consists of digits'0'
to'9'
only.
Solution
using ll = long long;
const int MOD = 1e9 + 7;
vector<ll> factors = []() {
vector<ll> result(81, 1);
for(int i = 1; i <= 80; ++i) {
result[i] = result[i - 1] * i % MOD;
}
return result;
}();
vector<ll> inv = []() {
vector<ll> result(81, 1);
for(int i = 2; i <= 80; ++i) {
result[i] = MOD - (MOD / i) * result[MOD % i] % MOD;
}
return result;
}();
vector<ll> factorsInv = []() {
vector<ll> result(81, 1);
for(int i = 1; i <= 80; ++i) {
result[i] = result[i - 1] * inv[i] % MOD;
}
return result;
}();
class Solution {
public:
int countBalancedPermutations(string num) {
int len = num.length();
int sum = 0;
for(auto c : num) {
sum += c - '0';
}
if(sum & 1) return 0;
int targetSum = sum / 2;
int targetLen = len / 2;
vector<vector<int>> dp(targetSum + 1, vector<int>(targetLen + 1));
dp[0][0] = 1;
vector<int> digits(10);
for(auto c : num) {
int d = c - '0';
digits[d] += 1;
for(int i = targetSum; i >= d; --i) {
for(int j = targetLen; j > 0; --j) {
dp[i][j] += dp[i - d][j - 1];
dp[i][j] %= MOD;
}
}
}
ll answer = dp[targetSum][targetLen];
answer = answer * factors[targetLen] % MOD * factors[len - targetLen] % MOD;
for(auto i : digits) {
answer *= factorsInv[i];
answer %= MOD;
}
return answer;
}
};
// Accepted
// 792/792 cases passed (123 ms)
// Your runtime beats 79.66 % of cpp submissions
// Your memory usage beats 72.88 % of cpp submissions (16 MB)