问题:
求[L, R]之间的素数表
解法:
先用埃氏筛法求出[1...sqrt(R)]上的素数表
再在[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 >=1 memset(ok, -1, sizeof(ok)); if(l==1) ok[0]=0; //error-prone int 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; }
时间: 2024-10-10 15:43:38