思路
对于这道题,我们可以发现一个事情:我们筛质数只需要筛 \(1 \sim \log_3 n\) 的部分就行了。
因为 \(k = p \times q^3\),那么,我们考虑一种极端情况,\(p\) 为一个很小的数,那么 \(k\) 就无限接近于 \(q^3\)。
我们就先假设 \(k = q^3\),那么可以得出 \(q = \log_3 n\)。然后由题目描述的条件可知 \(p < q\),所以,我们筛质数只需要筛到 \(\log_3 n\) 即可。
然后,我们暴力一遍即可。
Code
#include <bits/stdc++.h>
#define int long long
#define re register
using namespace std;
const int N = 1e6 + 10,M = 1e5 + 10;
int n,idx,ans;
int p[M];
bool vis[N];
inline int read(){
int r = 0,w = 1;
char c = getchar();
while (c < '0' || c > '9'){
if (c == '-') w = -1;
c = getchar();
}
while (c >= '0' && c <= '9'){
r = (r << 3) + (r << 1) + (c ^ 48);
c = getchar();
}
return r * w;
}
inline void init(int n){//埃筛
for (re int i = 2;i <= n;i++){
if (!vis[i]){
p[++idx] = i;
for (re int j = 1;i * j <= n;j++) vis[i * j] = true;
}
}
}
signed main(){
n = read();
int t = powl(n,1.0 / 3);
init(t);
for (re int i = 1;i <= idx;i++){
int x = p[i] * p[i] * p[i];//也就是题目中的 q
for (re int j = 1;j < i;j++){//因为 p < q,所以只需要枚举 1 ~ i 即可
int cnt = p[j] * x;//得出 k
if (cnt <= n) ans++;//更新答案
else break;//优化
}
}
printf("%lld",ans);
return 0;
}
标签:like,ABC250D,题解,质数,int,250,log
From: https://www.cnblogs.com/WaterSun/p/18261975