【数学 枚举】HR 的疑惑
题意
求出\([1,n]\)中有多少个数能用\(a^b\)的形式来表示。
\(1\leq n\leq 10^{18}\)
思路
\(n\)很大,所以我们尝试枚举指数,而且答案很小,我们对每个满足条件的数可以用map标记。
当我们发现b是合数时,\(a^b=(a^{b/i})^i\),其中\(i\)为\(b\)的约数,所以我们枚举的指数是质数。
代码
#include <map>
#include <cmath>
#include <cstdio>
std::map<long long, int> v;
long long n;
int ans;
int prime[] = {3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61};
int main() {
scanf("%lld", &n);
ans = pow(n, 0.5);
for (int ij = 0; ij <= 16; ij++) {
int maxn = pow(n, 1.0 / prime[ij]);
for (int i = 2; i <= maxn; i++) {
if (v[pow(i, prime[ij])] || (int)sqrt(i) * (int)sqrt(i) == i) continue;
v[pow(i, prime[ij])] = 1;
ans++;
}
}
printf("%d", ans);
}

浙公网安备 33010602011771号