<p>You are given two numeric strings <code>num1</code> and <code>num2</code> and two integers <code>max_sum</code> and <code>min_sum</code>. We denote an integer <code>x</code> to be <em>good</em> if:</p>

<ul>
	<li><code>num1 &lt;= x &lt;= num2</code></li>
	<li><code>min_sum &lt;= digit_sum(x) &lt;= max_sum</code>.</li>
</ul>

<p>Return <em>the number of good integers</em>. Since the answer may be large, return it modulo <code>10<sup>9</sup> + 7</code>.</p>

<p>Note that <code>digit_sum(x)</code> denotes the sum of the digits of <code>x</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> num1 = &quot;1&quot;, num2 = &quot;12&quot;, <code>min_sum</code> = 1, max_sum = 8
<strong>Output:</strong> 11
<strong>Explanation:</strong> There are 11 integers whose sum of digits lies between 1 and 8 are 1,2,3,4,5,6,7,8,10,11, and 12. Thus, we return 11.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> num1 = &quot;1&quot;, num2 = &quot;5&quot;, <code>min_sum</code> = 1, max_sum = 5
<strong>Output:</strong> 5
<strong>Explanation:</strong> The 5 integers whose sum of digits lies between 1 and 5 are 1,2,3,4, and 5. Thus, we return 5.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= num1 &lt;= num2 &lt;= 10<sup>22</sup></code></li>
	<li><code>1 &lt;= min_sum &lt;= max_sum &lt;= 400</code></li>
</ul>

MOD = 10**9 + 7

class Solution:
    def count(self, num1: str, num2: str, min_sum: int, max_sum: int) -> int:
        # Helper function to calculate the count of valid numbers <= num_str
        def digit_dp(idx, tight, sum_digits, num_str, min_sum, max_sum, dp):
            if sum_digits > max_sum:
                return 0  # Exceeded max_sum, invalid
            
            if idx == len(num_str):  # All digits processed
                return 1 if min_sum <= sum_digits <= max_sum else 0
            
            if (idx, tight, sum_digits) in dp:
                return dp[(idx, tight, sum_digits)]
            
            limit = int(num_str[idx]) if tight else 9
            result = 0
            
            for digit in range(0, limit + 1):
                result += digit_dp(idx + 1, tight and (digit == limit), sum_digits + digit, num_str, min_sum, max_sum, dp)
                result %= MOD
            
            dp[(idx, tight, sum_digits)] = result
            return result

        # Function to count all valid numbers <= num_str
        def count_up_to(num_str, min_sum, max_sum):
            dp = {}
            return digit_dp(0, True, 0, num_str, min_sum, max_sum, dp)
        
        # Convert num1 and num2 to the range [num1, num2]
        num1_minus_one = str(int(num1) - 1)
        
        count_num2 = count_up_to(num2, min_sum, max_sum)
        count_num1_minus_one = count_up_to(num1_minus_one, min_sum, max_sum)
        
        # Return the difference to get count in the range [num1, num2]
        return (count_num2 - count_num1_minus_one + MOD) % MOD

# Example usage:
sol = Solution()
print(sol.count("1", "12", 1, 8))  # Expected: 11
print(sol.count("1", "5", 1, 5))   # Expected: 5
16900