模板 區間篩素數

2022-05-10 02:42:13 字數 1219 閱讀 7379

原理:乙個數的倍數肯定不是素數

若給定子區間[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 先全部弄成素數,注...