nssl1210-質數【素數篩】
阿新 • • 發佈:2018-12-16
正題
題目大意
求這個區間素數或兩個素數的乘積的數個數
解題思路
在歐式篩的時候判斷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("");
}
}