Given two integers N and K. The task is to count all positive integers with length N having an absolute difference between adjacent digits equal to K.
Examples:
Input: N = 4, K = 8
Output: 3
Explanation: The absolute difference between every consecutive digit of each number is 8. Three possible numbers are 8080, 1919 and 9191.Input: N = 2, K = 0
Output: 9
Explanation: 11, 22, 33, 44, 55, 66, 77, 88, 99. The absolute difference between every consecutive digit of each number is 0.
Approach: The approach is based on recursion. Iterate over digits [1, 9], and for each digit, count the N-digit number having a difference of absolute digit as K using recursion. Following cases arrive in the recursive function call.
- Base Case: For all single-digit integers i.e. N = 1, increment answer count.
- Recursive Call: If adding digit K to the one’s digit of the number formed till now (num) does not exceed 9, then recursively call by decreasing N and making num = (num*10 + num%10 + K).
if(num % 10 + K ≤ 9)Â
  recursive_function(10 * num + (num % 10 + K), N – 1);Â
- If the value of K is non-zero after all the recursive calls and if num % 10 ≥ K, then again recursively call by decreasing the N and update num to (10*num + num%10 – K).
if(num % 10 ≥ K)Â
  recursive_function(10 * num + num % 10 – K, N – 1)
Below is the implementation of the above approach.
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; Â
// To store the count of numbers int countNums = 0; Â
// Function that recursively finds the // possible numbers and append into ans void checkUtil( int num, int K, int N) {     // Base Case     if (N == 1) {         countNums++;         return ;     } Â
    // Check the sum of last digit and k     // less than or equal to 9 or not     if ((num % 10 + K) <= 9)         checkUtil(10 * num +                   (num % 10 + K), K, N - 1); Â
    // If K = 0, then subtraction and     // addition does not make any     // difference     if (K) {                  // If unit's digit greater than K         if ((num % 10 - K) >= 0)             checkUtil(10 * num +                       num % 10 - K, K, N - 1);     } } Â
// Function to call checkUtil function // for every integer from 1 to 9 void check( int K, int N) {     // Loop to check for     // all digits from 1 to 9     for ( int i = 1; i <= 9; i++) {         checkUtil(i, K, N);     } } Â
// Driver Code int main() { Â Â Â Â // Given N and K Â Â Â Â int N = 4, K = 8; Â Â Â Â check(K, N); Â
    // Count total possible numbers     cout << countNums << endl;     return 0; } |
Java
// Java program for the above approach import java.util.*; Â
class GFG{ Â
// To store the count of numbers static int countNums = 0 ; Â
// Function that recursively finds the // possible numbers and append into ans static void checkUtil( int num, int K, int N) {        // Base Case     if (N == 1 ) {         countNums++;         return ;     } Â
    // Check the sum of last digit and k     // less than or equal to 9 or not     if ((num % 10 + K) <= 9 )         checkUtil( 10 * num +                   (num % 10 + K), K, N - 1 ); Â
    // If K = 0, then subtraction and     // addition does not make any     // difference     if (K> 0 ) {                  // If unit's digit greater than K         if ((num % 10 - K) >= 0 )             checkUtil( 10 * num +                       num % 10 - K, K, N - 1 );     } } Â
// Function to call checkUtil function // for every integer from 1 to 9 static void check( int K, int N) {        // Loop to check for     // all digits from 1 to 9     for ( int i = 1 ; i <= 9 ; i++) {         checkUtil(i, K, N);     } } Â
// Driver Code public static void main(String[] args) { Â Â Â Â Â Â Â // Given N and K Â Â Â Â int N = 4 , K = 8 ; Â Â Â Â check(K, N); Â
    // Count total possible numbers     System.out.print(countNums + "\n" ); } } Â
// This code contributed by shikhasingrajput |
Python3
# Python program for the above approach Â
# To store the count of numbers countNums = 0 ; Â
# Function that recursively finds the # possible numbers and append into ans def checkUtil(num, K, N):     global countNums;          # Base Case     if (N = = 1 ):         countNums + = 1 ;         return ; Â
    # Check the sum of last digit and k     # less than or equal to 9 or not     if ((num % 10 + K) < = 9 ):         checkUtil( 10 * num + (num % 10 + K), K, N - 1 ); Â
    # If K = 0, then subtraction and     # addition does not make any     # difference     if (K > 0 ): Â
        # If unit's digit greater than K         if ((num % 10 - K) > = 0 ):             checkUtil( 10 * num + num % 10 - K, K, N - 1 ); Â
# Function to call checkUtil function # for every integer from 1 to 9 def check(K, N):        # Loop to check for     # all digits from 1 to 9     for i in range ( 1 , 10 ):         checkUtil(i, K, N); Â
# Driver Code if __name__ = = '__main__' : Â Â Â Â # Given N and K Â Â Â Â N = 4 ; Â Â Â Â K = 8 ; Â Â Â Â check(K, N); Â
    # Count total possible numbers     print (countNums); Â
# This code is contributed by shikhasingrajput |
C#
// C# program for the above approach using System; Â
class GFG{ Â
// To store the count of numbers static int countNums = 0; Â
// Function that recursively finds the // possible numbers and append into ans static void checkUtil( int num, int K, int N) {          // Base Case     if (N == 1)     {         countNums++;         return ;     } Â
    // Check the sum of last digit and k     // less than or equal to 9 or not     if ((num % 10 + K) <= 9)         checkUtil(10 * num +                  (num % 10 + K), K, N - 1); Â
    // If K = 0, then subtraction and     // addition does not make any     // difference     if (K > 0)     {                  // If unit's digit greater than K         if ((num % 10 - K) >= 0)             checkUtil(10 * num +                       num % 10 - K, K, N - 1);     } } Â
// Function to call checkUtil function // for every integer from 1 to 9 static void check( int K, int N) {          // Loop to check for     // all digits from 1 to 9     for ( int i = 1; i <= 9; i++)     {         checkUtil(i, K, N);     } } Â
// Driver Code public static void Main(String[] args) { Â Â Â Â Â Â Â Â Â // Given N and K Â Â Â Â int N = 4, K = 8; Â Â Â Â check(K, N); Â
    // Count total possible numbers     Console.Write(countNums + "\n" ); } } Â
// This code is contributed by 29AjayKumar |
Javascript
<script> Â Â Â Â Â Â // JavaScript code for the above approach Â
      // To store the count of numbers       let countNums = 0; Â
      // Function that recursively finds the       // possible numbers and append into ans       function checkUtil(num, K, N)       {                  // Base Case           if (N == 1) {               countNums++;               return ;           } Â
          // Check the sum of last digit and k           // less than or equal to 9 or not           if ((num % 10 + K) <= 9)               checkUtil(10 * num +                   (num % 10 + K), K, N - 1); Â
          // If K = 0, then subtraction and           // addition does not make any           // difference           if (K) { Â
              // If unit's digit greater than K               if ((num % 10 - K) >= 0)                   checkUtil(10 * num +                       num % 10 - K, K, N - 1);           }       } Â
      // Function to call checkUtil function       // for every integer from 1 to 9       function check(K, N)       {                  // Loop to check for           // all digits from 1 to 9           for (let i = 1; i <= 9; i++) {               checkUtil(i, K, N);           }       } Â
      // Driver Code Â
      // Given N and K       let N = 4, K = 8;       check(K, N); Â
      // Count total possible numbers       document.write(countNums + '<br>'); Â
// This code is contributed by Potta Lokesh   </script> |
3
Time Complexity: O(2N)
Auxiliary Space: O(1)
Â
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!