10110 - Light, more light
There is man named ”mabu” for switching on-off light in our University. He switches on-off the lights in a corridor. Every bulb has its own toggle switch. That is, if it is pressed then the bulb turns on. Another press will turn it off. To save power consumption (or may be he is mad or something else) he does a peculiar thing. If in a corridor there is n bulbs, he walks along the corridor back and forth n times and in i-th walk he toggles only the switches whose serial is divisable by i. He does not press any switch when coming back to his initial position. A i-th walk is defined as going down the corridor (while doing the peculiar thing) and coming back again. Now you have to determine what is the final condition of the last bulb. Is it on or off?
Input
The input will be an integer indicating the n’th bulb in a corridor. Which is less then or equals 232 −1. A zero indicates the end of input. You should not process this input.
Output
Output ‘yes’ if the light is on otherwise ‘no’, in a single line.
Sample Input
3 6241 8191 0Sample Output
no yes no
Here is my code:
#include <stdio.h>
int main()
{
unsigned int n, a, d, i, j;
while (1)
{
scanf("%u", &n);
if (n == 0)
{
break;
}
a = n / 2;
d = 0;
for (i = 1; i <= a; i++)
{
if (n % i == 0)
{
d++;
}
}
if (d % 2 == 0)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}
Is that even possible in C ? Not allowed to use any other language :( Language they used : ANSI C 5.3.0 - GNU C Compiler with options: -lm -lcrypt -O2 -pipe -ansi -DONLINE_JUDGE
The run time should not exceed 3 seconds.
Looping to
n/2is very slow as code only needs to loop tosqrt(n).is replaceable with below which loops up to
sqrt(n)times.And since later code only needs the even-ness of
d, thefor (i=1; i < a/i; i++) {loop serves little other than to getiup to near the square root ofn. Consider testing ifnis a perfect square instead and watch out for edge cases whenn <= 1. (Careful withdouble sqrt(double)as that may incur unexpected rounding.)Note: do not use
...; i*i < n; i++asi*imay overflow whennis a large value nearUINT_MAX.Pedantically, use a wider type that
unsigned, which may have less range than needed. Suggestunsigned long.