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;
}

posted @ 2023-02-25 14:09  Liang2003  阅读(16)  评论(0编辑  收藏  举报