ABC300D AABCC

\(\texttt{Description}\)

AtCoder 题目链接

  • 给定 \(N\),求有多少个正整数 \(x\) 满足:

    • \(1\le x\le N\)

    • \(x=a^2\times b\times c^2\),其中 \(a,b,c\in \mathbb{P}\)\(a<b<c\)

  • \(300\le N\le 10^{12}\)

\(\texttt{Solution}\)

首先把 \(x\) 写成 \((a\times c)^2\times b\),考虑枚举 \(a\times c\)

于是枚举 \(i\in[10,\lfloor\sqrt{N}\rfloor]\),考虑怎样的 \(i\) 满足条件。

\(num_i\)\(i\) 的质因数集合的大小,\(tot_i\)\(i\) 的质因数可重集的大小。可以线性筛预处理。显然,需要满足 \(num_i=2\)\(tot_i=2\)。同时线性筛处理 \(L_i,R_i\)\(i\) 的最小/最大质因数。考虑 \(b\) 的范围,显然 \(b\in\left[1,\left\lfloor\dfrac{N}{i^2}\right\rfloor\right]\)\(b\in(L_i,R_i)\),求出交集(无交跳过)。设最终得到 \(b\in[p,q]\),再预处理一个 \(s_i\) 表示 \(1\sim i\) 中质数的个数,满足条件的 \(b\) 的个数即为 \(s_q-s_{p-1}\)

时间复杂度和空间复杂度均为 \(\mathcal{O}(\sqrt{N})\)

\(\texttt{Code}\)

Submission

$\texttt{Click For Code}$
#include<bits/stdc++.h>
#define int long long
#define N 1000005
using namespace std;
int p[N],cnt,num[N],s[N],L[N],R[N],ans,tot[N];
bool is[N];
signed main(){
	memset(is,1,sizeof is);
	is[1]=0; 
	int n;
	cin>>n;
	for(int i=2;i*i<=n;++i){
		s[i]=s[i-1]+is[i];
		if(is[i]){
			tot[i]=num[i]=1;
			L[i]=R[i]=i;
			p[++cnt]=i;
		}
		for(int j=1;j<=cnt&&i*i*p[j]*p[j]<=n;++j){
			is[i*p[j]]=0;
			tot[i*p[j]]=tot[i]+1;
			if(i%p[j]){
				num[i*p[j]]=num[i]+1;
				L[i*p[j]]=p[j];
				R[i*p[j]]=R[i];
			}else{
				num[i*p[j]]=num[i];
				L[i*p[j]]=L[i];
				R[i*p[j]]=R[i];
				break;
			}
		}
	}
	for(int i=sqrt(n);i>=10;--i){
		if(num[i]!=2||tot[i]!=2){
			continue;
		}
		int k=n/(i*i);
		if(k<=L[i]){
			continue;
		}
		if(R[i]-L[i]<=1){
			continue;
		}
		ans+=s[min(k,R[i]-1)]-s[L[i]];
	}
	cout<<ans;
}
posted @ 2023-04-29 23:32  lzyqwq  阅读(73)  评论(0)    收藏  举报