【数学 枚举】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);
}
posted @ 2020-08-12 16:12  nymph181  阅读(96)  评论(0)    收藏  举报