Cake Distribution Problem - GeeksforGeeks

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: 0 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 = 0Input: N = 3, M = 8 Output: 1 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++
Java
Python3
C#
Javascript
// C++ implementation of the approach#include<bits/stdc++.h>using namespace std; // Function to return the// remaining count of cakesint 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 Codeint main (){    int n = 3;    int m = 8;    int ans = cntCakes(n, m);    cout << (ans);} // This code is contributed by Surendra_Gangwar
// Java implementation of the approachclass 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 implementation of the approach # Function to return the# remaining count of cakesdef 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 codedef main():  n = 4  m = 11  ans = cntCakes(n, m)  print(ans) main()
// C# implementation of the approachusing 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.
<script>    // Javascript implementation of the approach         // Function to return the    // remaining count of cakes    function cntCakes(n, m)    {               // Sum for 1 cycle        let sum = (n * (n + 1)) / 2;               // no. of full cycle and remainder        let quo = m/sum;        let rem = m % sum ;        let ans = m - quo * sum + 6;               let x = (-1 + Math.pow((8 * rem) + 1, 0.5));                   ans = ans - x * (x + 1) / 2;               return parseInt(ans, 10);    }         let n = 3;    let m = 8;    let ans = cntCakes(n, m);    document.write(ans); // This code is contributed by suresh07.</script>
0
 
Time Complexity: O(1)
Auxiliary Space: O(1) 
ankthon
SURENDRA_GANGWAR
jit_t
suresh07
bunnyram19
subhammahato348
Constructive Algorithms
Mathematical
Mathematical
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Merge two sorted arrays
Modulo Operator (%) in C/C++ with Examples
Prime Numbers
Program to find GCD or HCF of two numbers
Sieve of Eratosthenes
Print all possible combinations of r elements in a given array of size n
Operators in C / C++
The Knight's tour problem | Backtracking-1
Program for factorial of a number
Program for Decimal to Binary Conversion