ABC300D AABCC
\(\texttt{Description}\)
给定 \(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}\)
$\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;
}

浙公网安备 33010602011771号