 Open in App
Not now

# Cake Distribution Problem

• Difficulty Level : Easy
• Last Updated : 08 Mar, 2022

Given two integers N and M, where N is the number of friends sitting in a clockwise manner in a circle and M is the number of cakes. The task is to calculate the left number of cakes after distributing i cakes to i’th friend. The distribution of cakes will stop if the count of cakes is less than the required amount.
Examples:

Input: N = 4, M = 11
Output:
1st round:
The 1st friend gets 1 cake, 2nd gets 2 cakes,
3rd get 3 and 4th gets 4 cakes.
Remaining cakes = 11 – (1 + 2 + 3 + 4) = 1
2nd round:
This time only 1st friend gets the left 1 cake.
Remaining cakes = 1 – 1 = 0
Input: N = 3, M = 8
Output:
1st round:
The 1st friend gets 1 cake, 2nd gets 2 cakes,
and 3rd get 3 cakes.
Remaining cakes = 8 – (1 + 2 + 3) = 2
2nd round:
This time only 1st friend gets the left 1 cake,
and then there is no cake left for 2nd friend.
Remaining cakes = 2 – 1 = 1

Approach:

• Check how many cycles of distribution of cakes are possible from m number of cakes.
• Calculate the number of cakes for 1 cycle which is

`sum = n * (n + 1) / 2`
• Now diving M by sum we get cycle count + some remainder.
• Now check how many remaining cakes are again possible to distribute to x friends.
• The value of x can be easily achieved by solving quadratic equation

`remainder = x * (x + 1) / 2`

Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach ` `#include` `using` `namespace` `std;`   `// Function to return the ` `// remaining count of cakes ` `int` `cntCakes(``int` `n, ``int` `m)` `{ `   `    ``// Sum for 1 cycle ` `    ``int` `sum = (n * (n + 1)) / 2;`   `    ``// no. of full cycle and remainder ` `    ``int` `quo = m/sum ;` `    ``int` `rem = m % sum ;` `    ``double` `ans = m - quo * sum ;`   `    ``double` `x = (-1 + ``pow``((8 * rem) + 1, 0.5)) / 2;` `    `  `    ``ans = ans - x * (x + 1) / 2;`   `    ``return` `int``(ans);` `}`   `// Driver Code` `int` `main () ` `{` `    ``int` `n = 3;` `    ``int` `m = 8; ` `    ``int` `ans = cntCakes(n, m);` `    ``cout << (ans);` `}`   `// This code is contributed by Surendra_Gangwar`

## Java

 `// Java implementation of the approach ` `class` `GFG ` `{` `    `  `    ``// Function to return the ` `    ``// remaining count of cakes ` `    ``static` `int` `cntCakes(``int` `n, ``int` `m)` `    ``{ ` `    `  `        ``// Sum for 1 cycle ` `        ``int` `sum = (n * (n + ``1``)) / ``2``;` `    `  `        ``// no. of full cycle and remainder ` `        ``int` `quo = m/sum ;` `        ``int` `rem = m % sum ;` `        ``double` `ans = m - quo * sum ;` `    `  `        ``double` `x = (-``1` `+ Math.pow((``8` `* rem) + ``1``, ``0.5``)) / ``2``;` `        `  `        ``ans = ans - x * (x + ``1``) / ``2``;` `    `  `        ``return` `(``int``)ans;` `    ``}`   `    ``// Driver Code` `    ``public` `static` `void` `main (String[] args) ` `    ``{` `        ``int` `n = ``3``;` `        ``int` `m = ``8``; ` `        ``int` `ans = cntCakes(n, m);` `        ``System.out.println(ans);` `    ``}` `}`   `// This code is contributed by AnkitRai01`

## Python3

 `# Python3 implementation of the approach`   `# Function to return the ` `# remaining count of cakes` `def` `cntCakes(n, m):`   `    ``# Sum for 1 cycle` `    ``sum` `=` `(n``*``(n ``+` `1``))``/``/``2`   `    ``# no. of full cycle and remainder` `    ``quo, rem ``=` `m``/``/``sum``, m ``%` `sum` `    ``ans ``=` `m ``-` `quo ``*` `sum`   `    ``x ``=` `int``((``-``1` `+` `(``8` `*` `rem ``+` `1``)``*``*``0.5``)``/``2``)` `    ``ans ``=` `ans ``-` `x``*``(x ``+` `1``)``/``/``2`   `    ``return` `ans`   `# Driver code` `def` `main():` `  ``n ``=` `4` `  ``m ``=` `11` `  ``ans ``=` `cntCakes(n, m)` `  ``print``(ans)`   `main()`

## C#

 `// C# implementation of the approach` `using` `System;`   `class` `GFG` `{` `    ``// Function to return the ` `    ``// remaining count of cakes ` `    ``static` `int` `cntCakes(``int` `n, ``int` `m)` `    ``{ ` `    `  `        ``// Sum for 1 cycle ` `        ``int` `sum = (n * (n + 1)) / 2;` `    `  `        ``// no. of full cycle and remainder ` `        ``int` `quo = m/sum ;` `        ``int` `rem = m % sum ;` `        ``double` `ans = m - quo * sum ;` `    `  `        ``double` `x = (-1 + Math.Pow((8 * rem) + 1, 0.5)) / 2;` `        `  `        ``ans = ans - x * (x + 1) / 2;` `    `  `        ``return` `(``int``)ans;` `    ``}`   `    ``// Driver Code` `    ``static` `public` `void` `Main ()` `    ``{` `        ``int` `n = 3;` `        ``int` `m = 8; ` `        ``int` `ans = cntCakes(n, m);` `        ``Console.Write(ans);` `    ``}` `}`   `// This code is contributed by ajit.`

## Javascript

 ``

Output:

`0`

Time Complexity: O(1)

Auxiliary Space: O(1)

My Personal Notes arrow_drop_up
Related Articles