题目链接:http://poj.org/problem?id=2689
题意
给出一个区间[L,R],求这个区间内的连续两个素数之间的差最大和最小的两个素数,范围限制为1<=L< U<=2,147,483,647。但是所给的区间长度不会超过1000000。
题解
对于这个范围,全部筛选打表是不现实的,想到了只对区间内的素数进行筛选。这里用到了一个埃拉托色尼筛法的定理:如果n是一个合数,那么n一定有一个不超过sqrt(n)的素因子。这样我们只需要对前面5万个数的素数进行打表就行了。
枚举前面的素数,将对应区间内的合数进行删除,达到筛选的目的。同时计算素数对应到区间的倍数避免一个一个枚举,实现加速。
要注意新素数表中一些细节的处理,比如说排除值为1的情况。
代码
1 | const int maxn=1000003; |