日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

埃氏筛法的一般写法(区间筛法)

發布時間:2023/12/2 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 埃氏筛法的一般写法(区间筛法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題:

求 $[L, R]$ 之間的素數表

解法:

一個合數 $n$ 的最小素因子不超過 $\sqrt{n}$。

先用埃氏篩法求出 $[1,\lfloor \sqrt{R} \rfloor]$ 上的素數表

再在 $[L, R]$ 上用埃氏篩法求素數

?

const int N(1e5); bool isprime[N]; int prime[N]; void init(){memset(isprime, -1, sizeof(isprime));isprime[0]=isprime[1]=0;int np=0;for(int i=0; i<N; i++){if(isprime[i]){prime[np++]=i;for(int j=2*i; j<N; j+=i)isprime[j]=0;}} } typedef long long ll; const int M(1e5); bool ok[M]; int res[M]; int seive(ll l, ll r){ // l, r >=1memset(ok, -1, sizeof(ok));if(l==1) ok[0]=0; //error-proneint k=sqrt(r);for(int i=0; prime[i]<=k; i++){ll j=(l+prime[i]-1)/prime*prime;j=max(j, (ll)2*prime[i]);for(; j<=r; j+=prime[i])ok[j-l]=0;}int np=0;for(int i=0; i<=r-l; i++)if(ok[i]) res[np++]=i+(ll)l;return np; }

?

?更新:

不必先把 $[2, \lfloor \sqrt{R} \rfloor]$ 上的素數存下來。更好的做法是先分別做好 $[2, \lfloor \sqrt{R} \rfloor]$ 和 $[L, R]$ 的表,然后從?$[2, \lfloor \sqrt{R} \rfloor]$ 的表中篩得素數的同時,也將其倍數從 $[L, R]$ 中劃去。

const int N=1e6+5, M=sqrt(1e9);bool is_prime[N]; bool is_prime_small[M+1];void segment_seive(int l, int r){ // [l,r]int t=sqrt(r);for(int i=2; i<=t; i++)is_prime_small[i]=true;for(int i=0; i<=r-l; i++)is_prime[i]=true;for(int i=2; i<=t; i++)if(is_prime_small[i]){for(int j=2*i; j<=t; j+=i)is_prime_small[j]=false;for(int j=max(2, (l+i-1)/i)*i; j<=r; j+=i)is_prime[j-l]=false;} }

?

?

?

?

?

?

轉載于:https://www.cnblogs.com/Patt/p/4805212.html

總結

以上是生活随笔為你收集整理的埃氏筛法的一般写法(区间筛法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。