poj 3372 Candy Distribution——数论

假如所给的数是a,那么如果n*(n-1)/2+1(n>=0,n<a)可以遍历a的最小非负剩余系的话,那么就输出YES,否则输出NO
在输出NO的情况下,一定存在n1,n0,使得n1*(n1-1)/2+1==n0*(n0-1)/2+1 mod a                    (==表示同余)
即存在n1,n0      st. (n1-n0)/2*(n1+n0+1)==0    mod a
1.当a为奇数时,选取a-1,0就可以了,所以奇数一定输出NO
2.当a为2^l时,将n1,n0分奇偶讨论,没有一种情况是偶数*偶数,故一定输出YES
3.当a为S*2^l(S为奇数,S>1,l>0)时,(这个我想了一会没有想出来,就在网上搜了一下题解)
   只用证明存在性,不用具体找出这两个数
   令   n1-n0=S,n1+n0+1=2^(l+1) 解得 n1=(S+2^(l+1)-1)/2 ,n0=(2^(l+1)-S-1)/2
    接下来需要证明0<=n0<n1<n
    即证S+2^(l+1)-1<S*2^(l+1)
    即证S-1<(S-1)*2^(l+1)
    即证1<2*(l+1)
    得证。
因此,只有2.满足YES.

a27400 3372 Accepted 376K 0MS G++ 226B 2011-09-14 11:35:23
#include<cstdio>
#include
<cstdlib>
#include
<algorithm>
#include
<cstring>
#include
<cmath>

int main(void)
{
int n;
while(scanf("%d",&n)==1)
{
if(n&(n-1))
puts(
"NO");
else puts("YES");
}
return 0;
}

  

posted @ 2011-09-14 13:56  ω 提拉米兔 ℃  阅读(267)  评论(0编辑  收藏  举报