poj 3372 完全剩余系

题意:老师给N个学生发糖,第x次发糖发给编号为 f(x) 的学生。可以推知:f(x) = x * (x+1) / 2 % N(学生号为 0, 1, 2, 3, ```N-1 )
现在问你是否每个学生都能得到至少一颗糖。

题解:还是不太明白,代码倒是很短,就是判断输入数字n是否为2的幂。

(转自http://blog.csdn.net/weiguang_123/article/details/7686912)要使每个学生都至少得到一颗糖,那么f(x) 应该构成模N的完全剩余系。

那么这个问题的反面就是在什么情况下,f(x) 不能构成模N的完全剩余系。
我们知道若存在 x != y, 使得 f(x) = f(y),那么f(x)边不能构成模N的完全剩余系。
若f(x) = f(y), 推出 x * (x+1) / 2 % N = y * (y+1) / 2 % N, 推出 (x+y+1)(x-y) / 2 = 0 % N
这样可以假设 N^t = (x+y+1)(x-y)/2,于是这个等式成立的条件便是f(x) = f(y)成立的条件。
下面我们具体分析:
首先给出两个显而易见的结论:
(1).任意一个偶数都可以表示成 b * 2^e 的形式(b为奇数)
(2).(x+y+1)与(x-y)中必定一个是偶数一个是奇数

假如 N^t = (x+y+1)(x-y)/2
1.若N是奇数,那么N^t 还是奇数,于是我们一定可以找到适当的x,y,t使得 (x+y+1)(x-y)/2 = N^t,例如令 x = y + 2, 得 y + 3 = N^t,
得 y = N^t - 3。 所以在这种情况下f(x) = f(y),不能构成完全剩余系。
2.若N是2的幂,令N=2^e, 那么N^t = 2^(e*t) 为偶数,而(x+y+1)(x-y)/2是奇数,显然不可能存在x,y,t使得 N^t = (x+y+1)(x-y)/2。所以在这种情况下f(x) != f(y) 可以构成完全剩余系。
3.若N是形如 b * 2^e 的偶数,那么 N^t = b^t * 2^(e*t)。
令(x+y+1) = b^t, (x-y)/2 = 2^(e*t)
即(x+y+1) = b^t //一式
(x-y) = 2^(e*t+1) //二式
解一式二式构成的方程组,得到 2x = 2^(e*t+1) + b^t - 1,左右均为偶数,显然x是有解的,那么y也是有解的。所以在这种情况下f(x) = f(y),不能构成完全剩余系。

注意上面的式子并不是一般的式子,我们只是用它们来判断存在性,由 N^t = (x+y+1)(x-y)/2这一假设引出的,是由结果到原因的推导,并不能随意的求解。例如 2x = 2^(e*t+1) + b^t - 1,假如一边是奇数,一边是偶数,那么x显然是无解的。


#include <cstdio>
int T;
int main(){
 int n;
 while(scanf("%d",&n)!=EOF){
  if(n&(n-1))
   printf("NO\n");
  else
   printf("YES\n");
 }
 return 0;
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值