链接:https://ac.nowcoder.com/acm/contest/11214/H
来源:牛客网
题目描述
小红定义一个数满足以下条件为“漂亮数”:
1. 该数不是素数。
2. 该数可以分解为2个素数的乘积
4 是漂亮数,因为 4=2*2
21 是漂亮数,因为 21=3*7
30 不是漂亮数,因为 30=2*3*5
73 不是漂亮数。因为 73 本身即是素数。
输入 l 和 ,请你输出 闭区间中有多少个漂亮数。
输入描述:
第一行输入一个正整数 t ,代表有 次询问
两个正整数 和 ,用空格隔开。
1≤t≤1051≤t≤105
1≤l≤r≤1081≤l≤r≤108
输出描述:
共输出 t 行,每行为一个整数,代表 到 中漂亮数的数量。
示例1
输入
复制
1 150 200
输出
复制
12
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> p;
const int maxn=1e8+5;
bool vis[maxn];
int a[maxn];
void prime(int n){
for(int i=2;i<n;i++){
if(!vis[i])
p.push_back(i);
for(int j=0;p[j]*i<=n&&j<p.size();j++){
vis[i*p[j]]=1;
if(i%p[j]==0)
break;
}
}
}
int main(){
prime(maxn);
for(int i=0;i<p.size();i++){
for(int j=0;j<p.size();j++){
if(p[i]*p[j]>=maxn)
break;
a[p[i]*p[j]]=1;
}
}
for(int i=1;i<maxn;i++)
a[i]=a[i-1]+a[i];
int t;
cin>>t;
while(t--){
int l,r;
cin>>l>>r;
cout<<a[r]-a[l-1]<<endl;
}
}