Find K positive integers not exceeding N and having sum S
Last Updated :
24 Nov, 2021
Given three positive integers S, K, and N, the task is to find K distinct positive integers, not exceeding N and having sum equal to S. If it is not possible to find K such positive integers, print -1.
Examples:
Input: S = 15, K = 4, N = 8
Output: 1 2 4 8
Explanation:
One possible set of K such numbers is {1, 2, 3, 4} ( Since, 1 + 2 + 4 + 8 =15).
Other possible set of K numbers are {2, 3, 4, 6}, {1, 3, 4, 7}, etc.
Input: S = 14, K = 5, N = 6
Output: -1
Approach: Follow the steps below to solve the problem:
- If N is less than K, then print -1.
- If S is less than the sum of first K natural numbers, i.e. (1 + 2 + … + K) or if S is greater than the sum of last K natural numbers, i.e. from N to N – K + 1, then print -1.
- Iterate from 1 and keep adding every natural number encountered in a variable, say s1, while s1 ? S. Insert all the encountered elements in an array, say nums[].
- Extract K – 1 elements from nums[] and store in another array, say answer.
- The Kth element in the array answer[] will be (s1 – s2), where s2 is the sum of the K – 1 elements present in the array answer[].
- Traverse the array answer[] in reverse and reduce all array elements to less than or equal to N.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void solve( int S, int K, int N)
{
if (K > N) {
cout << "-1" << endl;
return ;
}
int max_sum = 0, min_sum = 0;
for ( int i = 1; i <= K; i++) {
min_sum += i;
max_sum += N - i + 1;
}
if (S < min_sum || S > max_sum) {
cout << "-1" << endl;
return ;
}
int s1 = 0;
vector< int > nums;
for ( int i = 1; i <= N; i++) {
if (s1 > S)
break ;
s1 += i;
nums.push_back(i);
}
vector< int > answer;
int s2 = 0;
for ( int i = 0; i < K - 1; i++) {
answer.push_back(nums[i]);
s2 += nums[i];
}
answer.push_back(S - s2);
int Max = N;
for ( int i = answer.size() - 1; i >= 0; i--) {
if (answer[i] > Max) {
int extra = answer[i] - Max;
if (i - 1 >= 0)
answer[i - 1] += extra;
answer[i] = Max;
Max--;
}
else
break ;
}
for ( auto x : answer)
cout << x << " " ;
cout << endl;
}
int main()
{
int S = 15, K = 4, N = 8;
solve(S, K, N);
return 0;
}
|
Java
import java.util.Vector;
class GFG{
static void solve( int S, int K, int N)
{
if (K > N)
{
System.out.println( "-1" );
return ;
}
int max_sum = 0 , min_sum = 0 ;
for ( int i = 1 ; i <= K; i++)
{
min_sum += i;
max_sum += N - i + 1 ;
}
if (S < min_sum || S > max_sum)
{
System.out.println( "-1" );
return ;
}
int s1 = 0 ;
Vector<Integer> nums = new Vector<>();
for ( int i = 1 ; i <= N; i++)
{
if (s1 > S)
break ;
s1 += i;
nums.add(i);
}
Vector<Integer> answer = new Vector<>();
int s2 = 0 ;
for ( int i = 0 ; i < K - 1 ; i++)
{
answer.add(nums.get(i));
s2 += nums.get(i);
}
answer.add(S - s2);
int Max = N;
for ( int i = answer.size() - 1 ;
i >= 0 ; i--)
{
if (answer.get(i) > Max)
{
int extra = answer.get(i) - Max;
if (i - 1 >= 0 )
answer.set(i - 1 ,
answer.get(i - 1 ) + extra);
answer.set(i, Max);
Max--;
}
else
break ;
}
for ( int x : answer)
System.out.print(x + " " );
System.out.println();
}
public static void main(String[] args)
{
int S = 15 , K = 4 , N = 8 ;
solve(S, K, N);
}
}
|
Python3
def solve(S, K, N):
if (K > N):
print ( "-1" )
return
max_sum, min_sum = 0 , 0
for i in range (K + 1 ):
min_sum + = i
max_sum + = N - i + 1
if (S < min_sum or S > max_sum):
print ( "-1" )
return
s1 = 0
nums = []
for i in range ( 1 , N + 1 ):
if (s1 > S):
break
s1 + = i
nums.append(i)
answer = []
s2 = 0
for i in range (K - 1 ):
answer.append(nums[i])
s2 + = nums[i]
answer.append(S - s2)
Max = N
for i in range ( len (answer) - 1 , - 1 , - 1 ):
if (answer[i] > Max ):
extra = answer[i] - Max
if (i - 1 > = 0 ):
answer[i - 1 ] + = extra
answer[i] = Max
Max - = 1
else :
break
for x in answer:
print (x, end = " " )
if __name__ = = '__main__' :
S,K,N = 15 , 4 , 8
solve(S, K, N)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static void solve( int S, int K, int N)
{
if (K > N)
{
Console.WriteLine( "-1" );
return ;
}
int max_sum = 0, min_sum = 0;
for ( int i = 1; i <= K; i++)
{
min_sum += i;
max_sum += N - i + 1;
}
if (S < min_sum || S > max_sum)
{
Console.WriteLine( "-1" );
return ;
}
int s1 = 0;
List< int > nums = new List< int >();
for ( int i = 1; i <= N; i++)
{
if (s1 > S)
break ;
s1 += i;
nums.Add(i);
}
List< int > answer = new List< int >();
int s2 = 0;
for ( int i = 0; i < K - 1; i++)
{
answer.Add(nums[i]);
s2 += nums[i];
}
answer.Add(S - s2);
int Max = N;
for ( int i = answer.Count - 1; i >= 0; i--)
{
if (answer[i] > Max)
{
int extra = answer[i] - Max;
if (i - 1 >= 0)
answer[i - 1] += extra;
answer[i] = Max;
Max--;
}
else
break ;
}
foreach ( int x in answer)
Console.Write(x + " " );
Console.WriteLine();
}
public static void Main()
{
int S = 15, K = 4, N = 8;
solve(S, K, N);
}
}
|
Javascript
<script>
function solve(S, K, N)
{
if (K > N)
{
document.write( "-1" );
return ;
}
let max_sum = 0, min_sum = 0;
for (let i = 1; i <= K; i++)
{
min_sum += i;
max_sum += N - i + 1;
}
if (S < min_sum || S > max_sum)
{
document.write( "-1" );
return ;
}
let s1 = 0;
let nums = [];
for (let i = 1; i <= N; i++)
{
if (s1 > S)
break ;
s1 += i;
nums.push(i);
}
let answer = [];
let s2 = 0;
for (let i = 0; i < K - 1; i++)
{
answer.push(nums[i]);
s2 += nums[i];
}
answer.push(S - s2);
let Max = N;
for (let i = answer.length - 1; i >= 0; i--)
{
if (answer[i] > Max)
{
let extra = answer[i] - Max;
if (i - 1 >= 0)
answer[i - 1] += extra;
answer[i] = Max;
Max--;
}
else
break ;
}
for (let x in answer)
document.write(answer[x] + " " );
document.write( "<br/>" );
}
let S = 15, K = 4, N = 8;
solve(S, K, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...