<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>

class Solution:
    def count(self, left: str, right: str, mn: int, mx: int) -> int:
        mod = 10**9 + 7
        @lru_cache(None)
        def helper(ind,tight,lead,cur):
            if ind == 0:
                if mn <= cur <= mx :
                    return 1
                return 0
            # if cur > mx :
            #     return 0
            ans = 0
            if lead:
                ans = helper(ind-1,0,1,cur)
                if tight:
                    upper = int(s[len(s)-ind])
                else:
                    upper = 9
                for j in range(1,upper+1):
                    ans += helper(ind-1, (tight and  j == upper), 0, cur+j)%mod
            else:
                if tight:
                    upper = int(s[len(s)-ind])
                else:
                    upper = 9
                for j in range(upper+1):
                    ans += helper(ind-1, (tight and j == upper), 0, cur+j)%mod
            return ans%mod
        @lru_cache(None)
        def find(ind,tight,lead,cur):
            if ind == 0:
                if mn <= cur <= mx :
                    return 1
                return 0
            # if cur > mx :
                # return 0
            ans = 0
            if lead:
                ans = find(ind-1,0,1,cur)
                if tight:
                    upper = int(s[len(s)-ind])
                else:
                    upper = 9
                for j in range(1,upper+1):
                    ans += find(ind-1, (tight and  j == upper), 0, cur+j)%mod
            else:
                if tight:
                    upper = int(s[len(s)-ind])
                else:
                    upper = 9
                for j in range(upper+1):
                    ans += find(ind-1, (tight and  j == upper), 0, cur+j)%mod
            return ans%mod
        s = str(right)
        a = helper(len(s),1,1,0)
        s = str(int(left)-1)
        b = find(len(s),1,1,0)
        # print(a,b)
        return (a-b + mod )% mod
340