题意
求出[1,n]中有多少个数能用a^b的形式来表示。
思路
n很大,所以我们尝试枚举指数,而且答案很小,我们对每个满足条件的数可以用map标记。
当我们发现b是合数时,ab=(ab/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);
}