找规律-POJ3372
来源:互联网 发布:蓝雨伞之恋 知乎 编辑:程序博客网 时间:2024/06/05 23:55
http://poj.org/problem?id=3372
一群小孩围成一个圈,老师顺时针发糖,分别每间隔0,1, 2, 3, 4……发一颗,问是否每个同学都有糖
打印了前几项看出来得规律,只要n是2^k则输出YES,否则输出NO
数论解法:
N个人围成一个圈,老师给N个人分糖果.第i次分到的人的编号是f(x) = (x*(x+1)/2)%N,这N个人能不能至少获得1个糖果.
易知必然存在i使得f(N - i - 1) = f(N + i) (mod N), 即周期为N,
只要判断f(x)能否构成N的完全剩余系,就能得出结果
f(x)为N的完全系,即证不存在i,j(i != j),使得f(i) == f(j)
i*(i - 1)/2 = j*(j-1)/2 (mod N) (i-j)*(i+j+1)/2 = 0 (mod N)
其中(i-j)与(i+j+1)异号.
假设(i-j)为偶数
若(i-j)/2为偶数,当N为S*2^l(S奇数,l > 0),有解
若(i-j)/2为奇数,当N为P*Q,(P,Q是奇数),有解
类似当(i+j+1)为偶数时也一样.
因此N只能是2^l(l > 0)
另外学会得东西是如何判断n是否为2^k
n&(n-1) == 0 true
因为2得k次方得二进制中一定只有一个1
#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#define ll long longusing namespace std;int main(){ int n; while(~scanf("%d",&n)) { if(n&(n-1)) printf("NO\n"); else printf("YES\n"); } return 0;}
阅读全文
0 0
- 找规律-POJ3372
- poj3372 Candy Distribution---找规律
- POJ3372
- 找规律
- 找规律!
- 找规律
- 找规律,
- 找规律
- 找规律
- 找规律
- 找规律
- 找规律
- 找规律
- 找规律
- 找规律
- 找规律
- 递归(找规律、找出口)
- 数字找规律
- 哈夫曼编码与哈夫曼树
- 数论知识
- Nagle算法
- 【BZOJ3192】【JLOI2013】删除物品
- hdoj 6058(2017 Multi-University Training Contest
- 找规律-POJ3372
- TwoSum(算法分析课week1)
- 大数据Hive的案例、参数、动态分区、分桶、视图、索引、运行方式、权限管理、Hive的优化_03_03
- buildroot
- Python切片赋值操作
- 指向函数的指针
- MFC一一框架类当中的一些操作(改变标题,设置菜单栏,工具栏)
- linux+apache+mysql+php环境搭建配置多个网站(全程实操)
- HDOJ 1394 Minimum Inversion Number(线段树+逆序数)