In this HackerRank Bonetrousle problem solution we have given the values of n, k, and b for t trips to the store, determine which boxes Papyrus must purchase during each trip. For each trip, print a single line of b distinct space-separated integers denoting the box number for each box of spaghetti Papyrus purchases (recall that the store only has one box of each kind). If it's not possible to buy n sticks of spaghetti by purchasing b boxes, print -1 instead.

HackerRank Bonetrousle problem solution


Problem solution in Python.

t = int(input())
for _ in range(t):
    n, k, b = [int(x) for x in input().split()]
    cur_sum = int(b * (1 + b) / 2)
    res = [x + 1 for x in range(b)]
    if cur_sum > n:
        print(-1)
        continue
    max_shift = k - b;
    for i in reversed(range(b)):
        shift = min(max_shift, n - cur_sum)
        res[i] += shift
        cur_sum += shift
    if cur_sum < n:
        print(-1)
        continue
    print(' '.join([str(x) for x in res]))
        

{"mode":"full","isActive":false}


Problem solution in Java.

import java.io.*;
import java.util.*;
import java.math.*;

public class Solution {

    public static void main(String[] args) {
        /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        long[] result = new long[100000];
        for (int t = 0; t < T; t++) {
            long n = in.nextLong();
            long k = in.nextLong();
            int b = in.nextInt();
            long minSum = (long) (1 + b) * b / 2;
            BigInteger maxSum = BigInteger.valueOf(k + k - (b - 1)).multiply(BigInteger.valueOf(b)).divide(BigInteger.valueOf(2));
            if (n < minSum || BigInteger.valueOf(n).compareTo(maxSum) > 0) {
                System.out.println(-1);
            } else {
                long div = (n - minSum) / b;
                int mod = (int) ((n - minSum) % b);
                for (int i = 0; i < b; i++) {
                    result[i] = i + 1 + div;
                }
                
                if (mod != 0) {
                    long next = result[b - 1] + 1;
                    result[b - mod] = next;
                }
                
                StringBuilder out = new StringBuilder();
                for (int i = 0; i < b; i++) {
                    if (i > 0) {
                        out.append(" ");
                    }
                    out.append(result[i]);
                }
                System.out.println(out.toString());
            }
        }
    }
}

{"mode":"full","isActive":false}


Problem solution in C++.

#include <bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
#define all( x ) x.begin(), x.end()
#define umin( x, y ) x = min( x, (y) )
#define umax( x, y ) x = max( x, (y) )

using namespace std;

typedef long long Lint;
typedef double db;
typedef pair<int,int> ii;

const int maxn = 100020;

Lint a, k, ar[maxn];
int b;

void solve() {
    scanf("%lld %lld %d",&a,&k,&b);
    Lint t = 0, beg = 0;
    for(int i=b;i>=1;i--) {
        t += k-i+1;
        if( t >= a ) break;
        if( i == 1 ) {
            printf("-1\n");
            return;
        }
    }
    for(int i=b;i>=1;i--) {
        ar[i] = i;
        beg += i;
    }
    if( a < beg ) {
        printf("-1\n");
        return;
    }
    Lint h = k;
    for(int i=b;i>=1;i--,h--) {
        if( a - beg > h-ar[i] ) beg += h - ar[i], ar[i] = h;
        else { ar[i] += a - beg; break; }
    }
    for(int i=1;i<b;i++) printf("%lld ",ar[i]); printf("%lld\n",ar[b]);
}

int main() {

    int n;
    scanf("%d",&n);
    while( n-- ) solve();
    return 0;
}

{"mode":"full","isActive":false}


Problem solution in C.

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {
    int t;
    long long int n, k, b;
    long long int llt, llt2, llt3;
    long long int i;
    int has_printed;
    
    scanf("%d", &t);
    
    while (t--) {
        scanf("%lld %lld %lld", &n, &k, &b);
        
        llt = (b * (b + 1)) >> 1;
        if (llt > n) {
            printf("-1\n");
            continue;
        }
        llt2 = n - llt;
        
        // divide llt2 with b
        if ((llt2 % b) == 0) {
            llt3 = llt2 / b;
            has_printed = 0;
            // if it is within limits, then we are good
            if ((b + llt3) <= k) {
                for (i = llt3 + 1; i <= llt3 + b; i++) {
                    if (has_printed) {
                        printf(" ");
                    }
                    printf("%lld", i);
                    has_printed = 1;
                }
                printf("\n");
            } else {
                printf("-1\n");
            }
        } else {
            llt3 = llt2 / b;
            // we are starting at lower end
            if ((llt3 + b) >= k) {
                printf("-1\n");
            } else {
                llt = llt2 % b;
                has_printed = 0;
                for (i = llt3 + 1; i <= (llt3 + b - llt); i++) {
                    if (has_printed) {
                        printf(" ");
                    }
                    printf("%lld", i);
                    has_printed = 1;
                }
                for (; i <= (llt3 + b); i++) {
                    printf(" ");
                    printf("%lld", i + 1);
                }
                printf("\n");
            }
        }
    }
    
    return 0;
}

{"mode":"full","isActive":false}