1. 程式人生 > >nssl1210-質數【素數篩】

nssl1210-質數【素數篩】

正題

題目大意

lrl\sim r這個區間素數或兩個素數的乘積的數個數

解題思路

在歐式篩的時候判斷j是不是素數,是就標記就行了。

code

#pragma GCC optimize(2)
#include<cstdio>
#define N 10000000
#define ll int
using namespace std;
ll prime[N],s[N*2],l,r,q,cnt;
bool v[N+10];
ll read(){
	int x=0,flag=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'
)flag=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*flag; } void write(ll x) { if(x>9) write(x/10); putchar(x%10+48); return; } void primes() { for(ll i=2;i<=N;i++) if(!v[i]) { prime[++cnt]=i; s[i]=1;//素數也標記 for(ll j=2;i*j<=
N;j++) { if(!v[j]&&j<=i)//是素數的乘積 s[i*j]=1; v[i*j]=true; } } } int main() { primes(); for(ll i=1;i<=N;i++) s[i]+=s[i-1]; q=read(); for(ll i=1;i<=q;i++) { l=read();r=read(); write(s[r]-s[l-1]); puts(""); } }