# Solving Leetcode Interviews in Seconds with AI: Count of Integers


	# Introduction
	In this blog post, we will explore how to solve the LeetCode problem "2719" using AI. LeetCode is a popular platform for preparing for coding interviews, and with the help of AI tools like [Chatmagic](https://www.chatmagic.app), we can generate solutions quickly and efficiently - helping you pass the interviews and get the job offer without having to study for months.

	# Problem Statement
	> You are given two numeric strings num1 and num2 and two integers max_sum and min_sum. We denote an integer x to be good if:  num1 <= x <= num2 min_sum <= digit_sum(x) <= max_sum.  Return the number of good integers. Since the answer may be large, return it modulo 109 + 7. Note that digit_sum(x) denotes the sum of the digits of x.   Example 1:  Input: num1 = "1", num2 = "12", min_sum = 1, max_sum = 8 Output: 11 Explanation: 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.  Example 2:  Input: num1 = "1", num2 = "5", min_sum = 1, max_sum = 5 Output: 5 Explanation: The 5 integers whose sum of digits lies between 1 and 5 are 1,2,3,4, and 5. Thus, we return 5.    Constraints:  1 <= num1 <= num2 <= 1022 1 <= min_sum <= max_sum <= 400  

	# Explanation
	Here's a breakdown of the solution:

*   **Dynamic Programming:** The core idea is to use dynamic programming (specifically, memoization) to efficiently calculate the number of integers within a given range that satisfy the digit sum constraint. We break the problem down into smaller overlapping subproblems.

*   **Top-Down Approach with Memoization:** A recursive function `count_good` explores all possible digits for each position in the number, keeping track of the current sum and the upper bound. The `@lru_cache` decorator stores results of previously computed subproblems to avoid redundant calculations.

*   **Helper function to count within range:** We create a helper function `count_range` to compute the good integers within the range [0, num] for given `min_sum`, and `max_sum`. We finally compute `count_range(num2, min_sum, max_sum) - count_range(num1 - 1, min_sum, max_sum)`. Note that num1 - 1 is converted to string before passed to `count_range` and is handled separately as `count_range` method would not accept a negative number.

*   **Time & Space Complexity:** O(length \* max\_sum \* 10), where length is the maximum length of `num1` and `num2`. The space complexity is dominated by the memoization cache, also O(length \* max\_sum).

	
	# Code
	```python
	from functools import lru_cache

def solve():
    num1 = input()
    num2 = input()
    min_sum = int(input())
    max_sum = int(input())
    
    MOD = 10**9 + 7

    def count_range(num_str, min_sum, max_sum):
        n = len(num_str)

        @lru_cache(None)
        def count_good(index, current_sum, is_tight):
            if index == n:
                return min_sum <= current_sum <= max_sum

            count = 0
            upper_bound = int(num_str[index]) if is_tight else 9

            for digit in range(upper_bound + 1):
                new_sum = current_sum + digit
                new_is_tight = is_tight and (digit == int(num_str[index]))
                count = (count + count_good(index + 1, new_sum, new_is_tight)) % MOD

            return count

        return count_good(0, 0, True)

    # Handle num1 - 1.  If num1 is "1", then num1 - 1 = "0".
    # Otherwise, subtract 1 and convert to string.
    if num1 == "1":
        count_num1_minus_1 = 0
    else:
        num1_int = int(num1)
        count_num1_minus_1 = count_range(str(num1_int - 1), min_sum, max_sum)

    result = (count_range(num2, min_sum, max_sum) - count_num1_minus_1) % MOD
    return result

# Driver code (for local testing - remove in submission)
# num1 = "1"
# num2 = "12"
# min_sum = 1
# max_sum = 8
# print(solve(num1, num2, min_sum, max_sum))  # Output: 11

# num1 = "1"
# num2 = "5"
# min_sum = 1
# max_sum = 5
# print(solve(num1, num2, min_sum, max_sum))  # Output: 5
    
def solve_interactive():
    print(solve())
    
if __name__ == "__main__":
    solve_interactive()
	```
			
