情况一:是某个质数的八次方。
情况二:是两个质数的平方的乘积。用二分求解个数。
#include<bits/stdc++.h>
using namespace std;
long long n,fans = 0;
long long pcnt = 0,primes[2000500];
bitset<2000500> vis;
void getprimes(long long x){
for(long long i = 2; i <= x; i++){
if(vis[i] == 0){
primes[++pcnt] = i;
}
for(long long j = 1; j <= pcnt && primes[j]*i <= x; j++){
if(vis[primes[j]*i]){
break;
}
vis[primes[j]*i] = 1;
}
}
return;
}
long long getans(long long x){
long long l = x,r = pcnt,mid,ans = x;
while(l <= r){
mid = l+((r-l)>>1);
if(primes[mid]*primes[mid] <= n/primes[x]/primes[x]){
ans = mid;
l = mid+1;
}else{
r = mid-1;
}
}
return ans-x;
}
int main(){
scanf("%lld",&n);
getprimes(sqrt(n)+1);
fans += sqrt(sqrt(sqrt(n)));//情况一
fans--;//fans 记录答案
// for(int i = 1; i <= pcnt; i++){
// printf("%lld ",primes[i]);
// }
// puts("");
for(long long i = 1; i <= pcnt; i++){
static long long tp;
tp = getans(i);//二分求情况二
if(tp == 0){
break;
}
// printf("%lld %lld %lld\n",primes[i],tp,primes[tp+i]);//调试
fans += tp;
}
printf("%lld",fans);
return 0;
}