Untitled

Anonymous
plain_text
03/29/2026 6:32 AM
1.5 KB
24
Indexable
class Solution {
public:
  const int mod = 1e9 + 7;
  int countArrays(vector<int>& digitSum) {
    int n = digitSum.size();
    auto digsum = [&] (int x){
      int s = 0;
      while (x){s += x % 10; x /= 10;}
      return s;
    };
    vector<vector<int>> v(51);
    for (int i = 0; i < 5001; i++){
      v[digsum(i)].push_back(i);
    }
    vector<vector<int>> dp(n);
    for (int i = 0; i < n; i++){
      if (i != 0) {
        dp[i].assign(v[digitSum[i]].size(), 0);
      } else {
        dp[i].assign(v[digitSum[i]].size(), 1);
      }
    }
    for (int i = 0; i < n - 1; i++){
      for (int j = 0; j < dp[i].size(); j++){
        auto it = lower_bound(v[digitSum[i + 1]].begin(), v[digitSum[i + 1]].end(), v[digitSum[i]][j]);
        if (it == v[digitSum[i + 1]].end()) continue;
        int idx = it - v[digitSum[i + 1]].begin();
        dp[i + 1][idx] = (dp[i + 1][idx] + dp[i][j]) % mod;
      }
      for (int j = 1; j < dp[i + 1].size(); j++){
        dp[i + 1][j] = (dp[i + 1][j] + dp[i + 1][j - 1]) % mod;
      }
    }
    long long ans = 0;
    for (int i = 0; i < dp[n - 1].size(); i++){
      ans += dp[n - 1][i];
      ans %= mod;
    }
    return ans;
  }
};
Editor is loading...
Leave a Comment