H题漂亮数
小红定义一个数满足以下条件为“漂亮数”:
- 该数不是素数。
- 该数可以分解为2个素数的乘积
求区间L-R的漂亮数个数
这题考察对素数筛的简单理解。
欧拉筛(线筛),每次都会把一定范围内素数倍数的数筛为合数,并且每个数只会筛到一次(primes[j]*i),那么筛掉的这个数已经满足了不是素数,其中一个数是素数,我们只要判断乘的那个倍数i是否为素数即可,前缀和预处理1e8,O(1)查询即可。
#include<bits/stdc++.h>
const int N = 1e8 + 5;
const int mod = 1e9 + 7;
typedef long long ll;
using namespace std;
//#define int long long
bool vis[N];
int ans[N];
bool p[N];int primes[N];int cnt;
void shai(int n)//欧拉筛
{
memset(p,true,sizeof(p));
p[0]=p[1]=false;
for(int i=2;i<=n;++i)
{
if(p[i])primes[++cnt]=i;
for (int j=1;j<=cnt&&primes[j]*i<=n;++j)
{
p[primes[j]*i] = 0;
if(p[i])vis[primes[j]*i]=1;//核心代码一行
if (i%primes[j]==0) break;
}
}
for(int i=1;i<=n;i++)
ans[i]+=ans[i-1]+(vis[i]==1);
}
int main()
{
shai(1e8);
int t;
cin>>t;
while(t--)
{
int l,r;
cin>>l>>r;
cout<<ans[r]-ans[l-1]<<endl;
}
return 0;
}
京公网安备 11010502036488号