SPCANDY - Editorial








Simple Math


You wish to equally distribute N candies among M people, using the following algorithm

nCandies = 0
candies-with-each-person = 0

while nCandies ≥ M
	nCandies = nCandies - M

Print the values of candies-with-each-person and nCandies at the end of the algorithm.


The given algorithm is an ad-hoc simultation of the division operation.

At the end of the algorithm, it is clear that

candies-with-each-person =
	quotient of N divided by M


nCandies =
	remainder of N divided by M


There were two common pitfalls. The hint to both of them lay discreetly within the Constraints section.

##M could be equal to 0
A lot of submissions received

Runtime Error: Floating Point Exception

verdict because of this pitfall.

The exact error of course is the attempted division by 0. Handling it as a special case is one solution.

##N,M could be equal to 8,589,934,591
This typically led to a Wrong Answer verdict. The range of integers handled by the 32-bit signed integer datatype is typically

[-2147483648 2147483647]

One had to use 64-bit integer datatype to solve this problem. This means

  • long long in C/C++ - as CodeChef uses the GNU C++ Compiler
  • long in Java


Given: N, M

if M == 0
	return {
		candies-with-each-person = 0,
		nCandies = N
	return {
		candies-with-each-person = N / M,
		nCandies = N % M

Here, we assume that

  • N and M are 64-bit integers
  • % is the modulo operation


Can be found here.


Can be found here.


Problem statement, replacing K by M:

while she has more than M candies


while nCandies ≥ M

‘More than’ means >, not >=

Let’s assume the problem statement was wrong, and it should have said ‘more than’.

Problem statement:

Your job is to tell how many candies will each student and the teacher
receive after the splitting is performed.


Handling [M=0] as a special case is one solution.

If M=0, then the algorithm provided in both the problem statement and editorial never terminates; it is undefined what happens after an infinite loop, not a special case.


hi codechef ,

my below code is not working but same code is one user post that is working

what problem, in my code

using System;

namespace SplittingCandies

class Program

static void Main(string[] args)

int t = int.Parse(Console.ReadLine());

for (int i = 0; i < t; i++)

string[] tc = Console.ReadLine().Split(’ ');

if (ulong.Parse(tc[1]) == 0)

Console.WriteLine(tc[0] + " " + tc[1]);


Console.WriteLine((ulong.Parse(tc[0]) / ulong.Parse(tc[1])) + " " + (ulong.Parse(tc[0]) % ulong.Parse(tc[1])));

below code working this is one of user code

using System;

namespace SplittingCandies

class Program

static void Main(string[] args)

int cases = int.Parse(Console.ReadLine());

for (int i = 0; i < cases; i++)

string[] input = Console.ReadLine().Split(’ ');

if(ulong.Parse(input[1]) == 0)

Console.WriteLine(input[1] + " " + input[0]);


Console.WriteLine((ulong.Parse(input[0]) / ulong.Parse(input[1])) + " " + (ulong.Parse(input[0]) % ulong.Parse(input[1])));



0 case was somehow hidden very well


note: just pay attention to k, whether if it is 0 or not


Why do we need to subtract candies at each stage and find the modulus and quotient at each stage?
Can’t we do it directly and in one step? Divide N by K, the quotient gives the candies each student will receive and the remainder the candies left with the teacher


@workforce , u are write but we have to take care when k=0 or n =0


why unsigned long cannot be used or simply long … as they are also of 8 byte ??? why only long long ???


@eabby007 unsigned long int range is from 0 to 4,294,967,295 (4 bytes!) wheras long long int is from -2^63 to 2^63-1 (8 bytes)


Whats wrong with this ?


@ajit_a Why is it scanf("%lld%d",&K,&N); and not scanf("%lld%lld",&K,&N);

N also needs to be long long.


Actually, the M=0 case here was to be interpreted as a special case, since the teacher can’t divide the candies by any students, since there are 0 students. On this case, the teacher receives all N candies… I’m sad this problem failed on being as trivial as possible due to this sort of complications… About the usage of long long it was really intended :slight_smile:


note: just pay attention to k, whether if it is 0 or not