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