In this HackerRank Making Candies Interview preparation kit problem you have to complete the minimuPasses function.

## Problem solution in Python programming.

```#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the minimumPasses function below.
def minimumPasses(m, w, p, n):
days = 0
candies = 0
answer = math.ceil(n / (m * w))

while days < answer:
if p > candies:
daysNeeded = math.ceil((p - candies) / (m * w))
candies += daysNeeded * m * w
days += daysNeeded

diff = abs(m - w)
available = candies // p
purchased = min(diff, available)

if m < w:
m += purchased
else:
w += purchased

rest = available - purchased
m += rest // 2
w += rest - rest // 2
candies -= available * p

candies += m * w
days += 1

remainingCandies = max(n - candies, 0)
answer = min(answer, days + math.ceil(remainingCandies / (m * w)))

if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')

mwpn = input().split()

m = int(mwpn)

w = int(mwpn)

p = int(mwpn)

n = int(mwpn)

result = minimumPasses(m, w, p, n)

fptr.write(str(result) + '\n')

fptr.close()```

## Problem solution in Java Programming.

```import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

// Complete the minimumPasses function below.
static long minimumPasses(long m, long w, long p, long n) {
long candies = 0;
long invest = 0;
long spend = Long.MAX_VALUE;

while (candies < n) {
// preventing overflow in m*w
long passes = (long) (((p - candies) / (double) m) / w);

if (passes <= 0) {
// machines we can buy in total
long mw = candies / p + m + w;
long half = mw >>> 1;
if (m > w) {
m = Math.max(m, half);
w = mw - m;
} else {
w = Math.max(w, half);
m = mw - w;
}
candies %= p;
passes++;
}

// handling overflowing
// if overflowing is encountered -> candies count are definitely more than long
// thus it is more than n since n is long
// so we've reached the goal and we can break the loop
long mw;
long pmw;
try {
mw = Math.multiplyExact(m, w);
pmw = Math.multiplyExact(passes, mw);
} catch (ArithmeticException ex) {
// we need to add current pass
invest += 1;
// increment will be 1 because of overflow
spend = Math.min(spend, invest + 1);
break;
}

candies += pmw;
invest += passes;
long increment = (long) Math.ceil((n - candies) / (double) mw);
spend = Math.min(spend, invest + increment);
}

return Math.min(spend, invest);
}

private static final Scanner scanner = new Scanner(System.in);

public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

String[] mwpn = scanner.nextLine().split(" ");

long m = Long.parseLong(mwpn);

long w = Long.parseLong(mwpn);

long p = Long.parseLong(mwpn);

long n = Long.parseLong(mwpn);

long result = minimumPasses(m, w, p, n);

bufferedWriter.write(String.valueOf(result));
bufferedWriter.newLine();

bufferedWriter.close();

scanner.close();
}
}```

### Problem solution in C++ programming.

```#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

bool check(ll machines, ll workers, ll price, ll target, ll rounds) {
if (machines >= (target+workers-1)/workers) return true;
ll cur = machines*workers;
rounds--;
if (rounds == 0) return false;
while (1) {
ll rem = target - cur;
ll rnds = (rem + machines*workers - 1) / (machines*workers);
if (rnds <= rounds) return true;
if (cur < price) {
rem = price - cur;
rnds = (rem + machines*workers - 1) / (machines*workers);
rounds -= rnds;
if (rounds < 1) return false;
cur += rnds * machines * workers;
}
cur -= price;
if (machines > workers) {
workers++;
} else {
machines++;
}
}
return false;
}

int main(){
ios::sync_with_stdio(0);
cin.tie(0);
ll m, w, p, n;
cin >> m >> w >> p >> n;
ll a = 1, b = 1000000000000LL;
while (a < b) {
ll mid = (a + b) >> 1;
if (check(m, w, p, n, mid)) {
b = mid;
} else {
a = mid + 1;
}
}
cout << a << "\n";
return 0;
}```