我们首先处理出的所有素数,由于时间限制
,空间限制很大,我们使用最优版的埃氏筛(时间复杂度
),然后对于每一对素数处理,标记,注意他们两个乘起来如果超过了
,就不要计算。具体实现见代码:
// Problem: 漂亮数
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/11214/H
// Memory Limit: 2097152 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
#define pb push_back
#define vc vector
#define fst first
#define scd second
#define int long long
#define rep(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int read(){
int res=0,fs=1; char c=getchar();
while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
return res*fs;
}
void print(int x){
if(x<0) { putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int n,cnt,m,ans,tmp,k;
const int N=1e8+5;
bool a[N];
int qzh[N],pri[10000005];
typedef pair<int,int> P;
//struct PROBLEM_SOLVER{
// int n,m;
//}solver;
//signed main(){
signed main() {
// ios::sync_with_stdio(false);
a[1]=1;
for(int i=2;i*i<=N-5;i++){
if(a[i]==0){
for(int j=i*i;j<=N-5;j+=i) {
a[j]=1;
}
}
}
rep(i,1,N-5){
if(a[i]==0) cnt++,pri[cnt]=i;
a[i]=0;
}
rep(i,1,cnt) rep(j,i,cnt) {
if(pri[i]*pri[j]<=N){
a[pri[i]*pri[j]]=1;
}else break;
}
rep(i,1,N-5){
qzh[i]=qzh[i-1]+(a[i]==1);
}
cin>>tmp;
while(tmp--){
int l,r;
l=read(),r=read();
if(l==0) cout<<qzh[r]<<'\n';
else
cout<<qzh[r]-qzh[l-1]<<'\n';
}
return 0;
}

京公网安备 11010502036488号