ABC 250 D
ABC 250 D
题意
求1到n范围内有以下性质的数的个数:
\(x=p*q^3\) ,其中p和q都是质数,\(p<q\).\(1\leq n\leq 10^{18}\)
思路
将\(10^6\)内的质数筛出来,这就是q的范围,
然后这个q的贡献为\(\frac{n}{q^3}\)以内的质数个数,但要注意可能\(\frac{n}{q^3}\)比q还要大,这时候就只能选q以下的质数了。
代码
void get_prime()
{
for(int i=2;i<N;i++)
{
if(!is[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&i*prime[j]<N;j++)
{
is[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
for(int i=2;i<N;i++) sum[i]=sum[i-1]+(is[i]==0);
}
int cal(int x) //三次方根
{
int i=1;
while(i*i*i<=n) i++;
return i-1;
}
void solve()
{
get_prime();
cin>>n;
int limit=cal(n);
for(int i=1;i<=cnt&&prime[i]<=limit;i++)
{
int k=prime[i]*prime[i]*prime[i];
int tmp=n/k;
tmp=min(prime[i]-1,tmp);
ans+=sum[tmp];
}
cout<<ans<<endl;
}