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;
}