正题
题目大意
求l∼rl\sim rl∼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("");}
}