​传送门​

题意

给你一个n,问1~n中有多少个数字找不到一个数使其满足

Codeforces 1423 K_c++

思路

合数一定可以,素数能满足的话就必须保证素数的二次方大于n,由于数据太大,先预处理出每一个数之前有多少素数,然后找到第一个不满足的素数是第几个素数,然后减法加一就是答案,1要特判。

代码

int a[maxn];

int main(){
int t;
cin>>t;
find_primer();///素数筛
a[0]=1;
for(int i=2;i<=maxn;i++){
if(!vis[i]){
a[i]=1;
}
a[i]+=a[i-1];
}
while(t--){
scanf("%d",&n);
if(n==1){
puts("1");
continue;
}
int count=1;
int tmp;
for(int i=0;i<cnt&&primer[i]<=n;i++){
if(primer[i]*primer[i]>n){
tmp=i;
break;
}
}
printf("%d\n",a[n]-tmp+1);
}
}