Given a number N and a sum S, find the count of numbers upto N that have digit sum equal to S.

Examples: Input : N = 100, S = 4 Output : 5 Upto 100 only 5 numbers(4, 13, 22, 31, 40) can produce 4 as their sum of digits. Input : N = 1000, S = 1 Output : 4 Upto 1000 only 4 numbers(1, 10, 100 and 1000) can produce 1 as their sum of digits.

We can do a digit DP having state (current index, whether the currently constructed number of i digits is equal or less than the number formed by first i digits of N, the sum of digits of currently constructed number).

Let dp[i][tight][sum_so_far] denotes the count of numbers whose first i digits have been considered and tight denotes whether the currently constructed number is equal or less than number formed by first i digits of N. If tight is true, then it means that currently constructed number is equal to the number constructed by first i digits of N. If it is false then it means that currently constructed number is less than the number constructed by first i digits of N. sum_so_far denotes the sum of digits of currently constructed number.

**Base Case:**

If i = number of digits in N, sum_so_far = Sum, then answer = 1 else answer is 0.

**Transitions:**

For filling (i+1)th digit we can consider following –

If tight is true, then it means that our constructed number is still equal to number formed by first i digits of N. We can try our current possible digit value from 0 to (i+1)th digit of N. If we try the digit more than (i+1)th digit, then the constructed number will become greater than number formed by first i digits of N, which will violate the property that our constructed number should be <= N.

If tight is false, then it means that number constructed from first i – 1 digits has become less than number constructed from the first i – 1 digit of N, So it means that our number can never exceed N, so we can chose the any digit from 0 to 9.

nsum_so_far can be obtained by adding sum_so_far and current digit(currdigit).

Finally we will return answer which is count of numbers upto N that have digit sum equal to S.

`#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// N can be max 10^18 and hence digitsum will be 162 maximum. ` `long` `long` `dp[18][2][162]; ` ` ` `long` `long` `solve(` `int` `i, ` `bool` `tight, ` `int` `sum_so_far, ` ` ` `int` `Sum, string number, ` `int` `len) ` `{ ` ` ` `if` `(i == len) { ` ` ` ` ` `// If sum_so_far equals to given sum then ` ` ` `// return 1 else 0 ` ` ` `if` `(sum_so_far == Sum) ` ` ` `return` `1; ` ` ` `else` ` ` `return` `0; ` ` ` `} ` ` ` ` ` `long` `long` `& ans = dp[i][tight][sum_so_far]; ` ` ` `if` `(ans != -1) { ` ` ` `return` `ans; ` ` ` `} ` ` ` ` ` `ans = 0; ` ` ` `bool` `ntight; ` ` ` `int` `nsum_so_far; ` ` ` `for` `(` `char` `currdigit = ` `'0'` `; currdigit <= ` `'9'` `; currdigit++) { ` ` ` ` ` `// Our constructed number should not become ` ` ` `// greater than N. ` ` ` `if` `(!tight && currdigit > number[i]) { ` ` ` `break` `; ` ` ` `} ` ` ` ` ` `// If tight is true then it will also be true for (i+1) digit. ` ` ` `ntight = tight || currdigit < number[i]; ` ` ` `nsum_so_far = sum_so_far + (currdigit - ` `'0'` `); ` ` ` `ans += solve(i + 1, ntight, nsum_so_far, Sum, number, len); ` ` ` `} ` ` ` ` ` `return` `ans; ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `long` `long` `count = 0; ` ` ` `long` `long` `sum = 4; ` ` ` `string number = ` `"100"` `; ` ` ` `memset` `(dp, -1, ` `sizeof` `dp); ` ` ` `cout << solve(0, 0, 0, sum, number, number.size()); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

5

**Time Complexity:** 2(tight) * Sum * log 10(N) * 10(transitions) = 20*log 10(N)*Sum.

## Recommended Posts:

- Count of Binary Digit numbers smaller than N
- Count of Numbers in Range where first digit is equal to last digit of the number
- Count n digit numbers not having a particular digit
- Count numbers from 1 to n that have 4 as a digit
- Count numbers having 0 as a digit
- Count numbers with unit digit k in given range
- Count numbers formed by given two digit with sum having given digits
- Count of n digit numbers whose sum of digits equals to given sum
- Count of Numbers in a Range where digit d occurs exactly K times
- Count of Numbers in a Range divisible by m and having digit d in even positions
- Count numbers with difference between number and its digit sum greater than specific value
- Count total number of N digit numbers such that the difference between sum of even and odd digits is 1
- Count different numbers that can be generated such that there digits sum is equal to 'n'
- Count numbers in a range having GCD of powers of prime factors equal to 1
- Largest number smaller than or equal to n and digits in non-decreasing order

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.