HDU 4715 Difference Between Primes——素数筛选,二分查找(STL)
这是HDU 4715 Difference Between Primes。由于这几天HDU有些问题,我这里打不开网页,所以我也就不贴链接了。
题目大意是说:对于每个偶数x
,都能找到一个两个素数a b
,使得a-b=x
。
让你验证这个结论,给出x
,求出a
和b
。(x≤1000000)
方法很简单,就是先打个素数表,对于每个给定的数,枚举小的数,二分查找大数即可。
这篇文章中的素数筛选法参考了kuangbin大神和shu_mj的写法,这是一个十分神奇的筛选法。在筛选过程中,每个非质数平均只被访问标记一次,所以效率非常高。
关于题目中的“如果不能查找到则输出FAIL”。其实可以证明,这种情况是不可能出现的。我们把这个程序运行一遍,遍历1~1000000
间的所有偶数,都没有出现一个FAIL。所以代码里边这部分内容就略过了。
关于STL的binary_search
和lower_bound
两者的实现都是二分查找,但是lower_bound
会返回一个迭代器,告诉你找到的位置,而binary_serach
是返回一个布尔型告诉你有没有找到。
这两种方法一般来说有着不同的作用。这里显然是用binary_serach
更好一些。
今天还发现binary_serach
有着更为强大的功能:一般来说,binary_serach
要求随机访问迭代器,可是在一些没有随机访问迭代器的数据结构上,比如map
和list
,binary_serach
将自动降级为线性搜索算法完成搜索。(←,可见STL确实强大。。。。)
以下为AC代码:
1 |
|