Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5261 | Accepted: 2882 |
Description
N children standing in circle who are numbered 1 through N clockwise are waiting their candies. Their teacher distributes the candies by in the following way:
First the teacher gives child No.1 and No.2 a candy each. Then he walks clockwise along the circle, skipping one child (child No.3) and giving the next one (child No.4) a candy. And then he goes on his walk, skipping two children (child No.5 and No.6) and giving the next one (child No.7) a candy. And so on.
Now you have to tell the teacher whether all the children will get at least one candy?
Input
The input consists of several data sets, each containing a positive integer N (2 ≤ N ≤ 1,000,000,000).
Output
For each data set the output should be either "YES" or "NO".
Sample Input
2 3 4
Sample Output
YES NO YES
首先要找规律,我先写了个辅助程序,查看哪些输入会得到YES的输出。代码如下:
#include"stdio.h"
int main()
{
int i,n,cur;
while(scanf("%d",&n)!=EOF)
{
int a[400]={1,1};
cur=2;
for(i=1;i<1000;i++)
{
cur=(cur+i)%n;
a[cur]++;
cur++;
}
printf("\n");
for(i=0;i<n;i++)
{
printf("%d : %d\n",i+1,a[i]);
}
}
return 0;
}
输入一些测试用例后,我发现凡是能写成2^k (1<=k<=29) 的数,得到的输出都是"YES",其他数都得到"NO"。容易写出代码:
#include"stdio.h"
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
while( (n & 0x1) ==0 )
{
n>>=0x1;
}
n>>=0x1;
printf("%s\n",n? "NO" : "YES");
}
return 0;
}
yinjili | 3372 | Accepted | 164K | 0MS | C++ | 206B |