原理:乙個數的倍數肯定不是素數
若給定子區間[fst, lst]
則必有區間內任意數最大的因子是sqrt(lst);
因此只需要將2 - sqrt(lst)中的所有質數的倍數從區間[fst, lst]中劃掉即可
剩下的就是區間內的素數
注意兩個情況
1. 第一次篩出的素數就在區間裡 要特判
2. 將區間[fst, lst]對映入[0, lst - fst]
3.bitset優化
例題 **:
/*
zeolim - an ac a day keeps the bug away*/
//pragma gcc optimize(2)
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const ld pi = acos(-1.0);
const ld e = exp(1.0);
const int inf = 0x3f3f3f3f;
const int maxn = 1e6 + 10;
const ll mod = 1e9 + 7;
vector getprime(ll n, ll m)
for(int j = 2 * i; j <= len; j += i)
} }for(int i = 0; i <= m - n; ++i)
return pri;}
int main()
if(val < rcha)
}if(cha > 0)
printf("%d,%d are closest, %d,%d are most distant.\n", rpa, rpb, pa, pb);
else
printf("there are no adjacent primes.\n"); }
return 0;
}
區間素數篩
給定整數a和b,請問區間 a,b 內有多少個素數?ab a 10 6 因為b以內合數的最小質因數一定不超過sqrt b 如果有sqrt b 以內的素數表的話,就可以把篩選法用在 a,b 上了,先分別做好 2,sqrt b 的表和 a,b 的表,然後從 2,sqrt b 的表中篩得素數的同時,也將其倍...
區間素數篩
題目 p1835 素數密度 題目中區間的端點很大,但是區間的長度不長.解題思路 1.先用埃氏篩選掉 1 到 sqrt r 的合數 2.用第一步的素數表篩選掉 l 到 r 的合數 一二步一起進行 3.計算素數個數 includeusing namespace std const int ma 1e6 ...
素數篩模板
素數篩的思想很是簡單,就是素數的倍數都是合數。所以打表就好,找到素數,然後把他的倍數都打成合數。餘下的就是真正的素數啦。注意1不是素數 define max 10000 求1 9999的素數 int i,j bool num max memset num,1,sizeof num 先全部弄成素數,注...