Number of ways to split N as sum of K numbers from the given range

09 Aug, 2021
Given four positive integer N, K, L, and R, the task is to split N as sum of K numbers lying in the range [L, R].Note: Since the number of ways can be very large. Output answer modulo 1000000007.Examples: 
Input : N = 12, K = 3, L = 1, R = 5 Output : 10 {2, 5, 5} {3, 4, 5} {3, 5, 4} {4, 3, 5} {4, 4, 4} {4, 5, 3} {5, 2, 5} {5, 3, 4} {5, 4, 3} {5, 5, 2}
Input : N = 23, K = 4, L = 2, R = 10 Output : 480 
Naive Approach We can solve the problem using recursion. At each step of recursion try to make a group of size L to R all There will be two arguments in the recursion which changes: 
pos – the group number
left – how much of N is left to be distributed
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R] #include <bits/stdc++.h> using namespace std; const int mod = 1000000007; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]int calculate(int pos, int left,              int k, int L, int R){    // Base Case    if (pos == k) {        if (left == 0)            return 1;        else            return 0;    }     // if N is divides completely    // into less than k groups    if (left == 0)        return 0;     int answer = 0;     // put all possible values    // greater equal to prev    for (int i = L; i <= R; i++) {        if (i > left)            break;        answer = (answer + calculate(pos + 1,                                     left - i, k, L, R))                 % mod;    }    return answer;} // Function to count the number of// ways to divide the number Nint countWaystoDivide(int n, int k,                      int L, int R){    return calculate(0, n, k, L, R);} // Driver Codeint main(){    int N = 12;    int K = 3;    int L = 1;    int R = 5;     cout << countWaystoDivide(N, K, L, R);    return 0;}
// Java implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R]class GFG{ static int mod = 1000000007; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]static int calculate(int pos, int left,                     int k, int L, int R){    // Base Case    if (pos == k)    {        if (left == 0)            return 1;        else            return 0;    }     // If N is divides completely    // into less than k groups    if (left == 0)        return 0;     int answer = 0;     // Put all possible values    // greater equal to prev    for(int i = L; i <= R; i++)    {       if (i > left)           break;       answer = ((answer +                  calculate(pos + 1,left - i,                            k, L, R)) % mod);    }    return answer;} // Function to count the number of// ways to divide the number Nstatic int countWaystoDivide(int n, int k,                             int L, int R){    return calculate(0, n, k, L, R);} // Driver Codepublic static void main(String[] args){    int N = 12;    int K = 3;    int L = 1;    int R = 5;     System.out.print(countWaystoDivide(N, K, L, R));}} // This code is contributed by Amit Katiyar
# Python3 implementation to count the# number of ways to divide N in K# groups such that each group# has elements in range [L, R] mod = 1000000007 # Function to count the number# of ways to divide the number N# in K groups such that each group# has number of elements in range [L, R]def calculate(pos, left, k, L, R):         # Base Case    if (pos == k):        if (left == 0):            return 1        else:            return 0     # If N is divides completely    # into less than k groups    if (left == 0):        return 0             answer = 0     # Put all possible values    # greater equal to prev    for i in range(L, R + 1):        if (i > left):            break        answer = (answer +                  calculate(pos + 1,                            left - i, k, L, R)) % mod    return answer # Function to count the number of# ways to divide the number Ndef countWaystoDivide(n, k, L, R):    return calculate(0, n, k, L, R) # Driver CodeN = 12K = 3L = 1R = 5 print(countWaystoDivide(N, K, L, R))     # This code is contributed by divyamohan123
// C# implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R]using System; class GFG{ static int mod = 1000000007; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]static int calculate(int pos, int left,                     int k, int L, int R){         // Base Case    if (pos == k)    {        if (left == 0)            return 1;        else            return 0;    }     // If N is divides completely    // into less than k groups    if (left == 0)        return 0;     int answer = 0;     // Put all possible values    // greater equal to prev    for(int i = L; i <= R; i++)    {       if (i > left)           break;       answer = ((answer +                  calculate(pos + 1,left - i,                            k, L, R)) % mod);    }    return answer;} // Function to count the number of// ways to divide the number Nstatic int countWaystoDivide(int n, int k,                             int L, int R){    return calculate(0, n, k, L, R);} // Driver Codepublic static void Main(String[] args){    int N = 12;    int K = 3;    int L = 1;    int R = 5;     Console.Write(countWaystoDivide(N, K, L, R));}} // This code is contributed by Amit Katiyar
<script> // Javascript implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R] var mod = 1000000007; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]function calculate(pos, left, k, L, R){    // Base Case    if (pos == k) {        if (left == 0)            return 1;        else            return 0;    }     // if N is divides completely    // into less than k groups    if (left == 0)        return 0;     var answer = 0;     // put all possible values    // greater equal to prev    for (var i = L; i <= R; i++) {        if (i > left)            break;        answer = (answer + calculate(pos + 1,                                     left - i, k, L, R))                 % mod;    }    return answer;} // Function to count the number of// ways to divide the number Nfunction countWaystoDivide(n, k, L, R){    return calculate(0, n, k, L, R);} // Driver Codevar N = 12;var K = 3;var L = 1;var R = 5;document.write( countWaystoDivide(N, K, L, R)); // This code is contributed by noob2000.</script>
10
 
Time Complexity: O(NK).
Efficient Approach: In the previous approach we can see that we are solving the subproblems repeatedly, i.e. it follows the property of Overlapping Subproblems. So we can memoize the same using DP table. 
Below is the implementation of the above approach:
C++
Java
Python3
C#
Javascript
// C++ implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R] #include <bits/stdc++.h> using namespace std; const int mod = 1000000007; // DP Tableint dp[1000][1000]; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]int calculate(int pos, int left,              int k, int L, int R){    // Base Case    if (pos == k) {        if (left == 0)            return 1;        else            return 0;    }     // if N is divides completely    // into less than k groups    if (left == 0)        return 0;     // If the subproblem has been    // solved, use the value    if (dp[pos][left] != -1)        return dp[pos][left];     int answer = 0;     // put all possible values    // greater equal to prev    for (int i = L; i <= R; i++) {        if (i > left)            break;        answer = (answer + calculate(pos + 1,                                     left - i, k, L, R))                 % mod;    }    return dp[pos][left] = answer;} // Function to count the number of// ways to divide the number Nint countWaystoDivide(int n, int k,                      int L, int R){    // Initialize DP Table as -1    memset(dp, -1, sizeof(dp));    return calculate(0, n, k, L, R);} // Driver Codeint main(){    int N = 12;    int K = 3;    int L = 1;    int R = 5;     cout << countWaystoDivide(N, K, L, R);    return 0;}
// Java implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R]class GFG{ static int mod = 1000000007; // DP Tablestatic int [][]dp = new int[1000][1000]; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]static int calculate(int pos, int left,                     int k, int L, int R){         // Base Case    if (pos == k)    {        if (left == 0)            return 1;        else            return 0;    }     // If N is divides completely    // into less than k groups    if (left == 0)        return 0;     // If the subproblem has been    // solved, use the value    if (dp[pos][left] != -1)        return dp[pos][left];     int answer = 0;     // Put all possible values    // greater equal to prev    for(int i = L; i <= R; i++)    {       if (i > left)           break;       answer = (answer + calculate(pos + 1, left - i,                                      k, L, R)) % mod;    }    return dp[pos][left] = answer;} // Function to count the number of// ways to divide the number Nstatic int countWaystoDivide(int n, int k,                             int L, int R){         // Initialize DP Table as -1    for(int i = 0; i < 1000; i++)    {       for(int j = 0; j < 1000; j++)       {          dp[i][j] = -1;       }    }    return calculate(0, n, k, L, R);} // Driver Codepublic static void main(String[] args){    int N = 12;    int K = 3;    int L = 1;    int R = 5;     System.out.print(countWaystoDivide(N, K, L, R));}} // This code is contributed by 29AjayKumar
# Python3 implementation to count the# number of ways to divide N in K# groups such that each group# has elements in range [L, R]mod = 1000000007  # DP Tabledp = [[-1 for j in range(1000)]          for i in range(1000)]  # Function to count the number# of ways to divide the number N# in K groups such that each group# has number of elements in range [L, R]def calculate(pos, left, k, L, R):     # Base Case    if (pos == k):        if (left == 0):            return 1        else:            return 0     # if N is divides completely    # into less than k groups    if (left == 0):        return 0      # If the subproblem has been    # solved, use the value    if (dp[pos][left] != -1):        return dp[pos][left]      answer = 0      # put all possible values    # greater equal to prev    for i in range(L, R + 1):        if (i > left):            break                 answer = (answer +                  calculate(pos + 1,                           left - i,                           k, L, R)) % mod         dp[pos][left] = answer         return answer # Function to count the number of# ways to divide the number Ndef countWaystoDivide(n, k, L, R):         return calculate(0, n, k, L, R) # Driver codeif __name__=="__main__":         N = 12    K = 3    L = 1    R = 5      print(countWaystoDivide(N, K, L, R))     # This code is contributed by rutvik_56
// C# implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R]using System;class GFG{ static int mod = 1000000007; // DP Tablestatic int [,]dp = new int[1000, 1000]; // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]static int calculate(int pos, int left,                     int k, int L, int R){         // Base Case    if (pos == k)    {        if (left == 0)            return 1;        else            return 0;    }     // If N is divides completely    // into less than k groups    if (left == 0)        return 0;     // If the subproblem has been    // solved, use the value    if (dp[pos, left] != -1)        return dp[pos, left];     int answer = 0;     // Put all possible values    // greater equal to prev    for(int i = L; i <= R; i++)    {        if (i > left)            break;        answer = (answer + calculate(pos + 1, left - i,                                       k, L, R)) % mod;    }    return dp[pos, left] = answer;} // Function to count the number of// ways to divide the number Nstatic int countWaystoDivide(int n, int k,                             int L, int R){         // Initialize DP Table as -1    for(int i = 0; i < 1000; i++)    {        for(int j = 0; j < 1000; j++)        {            dp[i, j] = -1;        }    }    return calculate(0, n, k, L, R);} // Driver Codepublic static void Main(){    int N = 12;    int K = 3;    int L = 1;    int R = 5;     Console.Write(countWaystoDivide(N, K, L, R));}} // This code is contributed by Code_Mech
<script> // JavaScript implementation to count the// number of ways to divide N in K// groups such that each group// has elements in range [L, R] var mod = 1000000007; // DP Tablevar dp = Array.from(Array(1000), ()=>Array(1000)); // Function to count the number// of ways to divide the number N// in K groups such that each group// has number of elements in range [L, R]function calculate(pos, left, k, L, R){    // Base Case    if (pos == k) {        if (left == 0)            return 1;        else            return 0;    }     // if N is divides completely    // into less than k groups    if (left == 0)        return 0;     // If the subproblem has been    // solved, use the value    if (dp[pos][left] != -1)        return dp[pos][left];     var answer = 0;     // put all possible values    // greater equal to prev    for (var i = L; i <= R; i++) {        if (i > left)            break;        answer = (answer + calculate(pos + 1,                                     left - i, k, L, R))                 % mod;    }    return dp[pos][left] = answer;} // Function to count the number of// ways to divide the number Nfunction countWaystoDivide(n, k, L, R){    // Initialize DP Table as -1    dp = Array.from(Array(1000), ()=>Array(1000).fill(-1));    return calculate(0, n, k, L, R);} // Driver Codevar N = 12;var K = 3;var L = 1;var R = 5;document.write( countWaystoDivide(N, K, L, R));  </script>
10
 
Time Complexity: O(N*K).Auxiliary Space: O(N*K). 
divyamohan123
amit143katiyar
29AjayKumar
Code_Mech
rutvik_56
Akanksha_Rai
noob2000
famously
pankajsharmagfg
Algorithms
Competitive Programming
Dynamic Programming
Recursion
Dynamic Programming
Recursion
Algorithms
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
DSA Sheet by Love Babbar
SDE SHEET - A Complete Guide for SDE Preparation
What is Hashing | A Complete Tutorial
Find if there is a path between two vertices in an undirected graph
Understanding Time Complexity with Simple Examples
Competitive Programming - A Complete Guide
Practice for cracking any coding interview
Arrow operator -> in C/C++ with Examples
Modulo 10^9+7 (1000000007)
Prefix Sum Array - Implementation and Applications in Competitive Programming