【数学 枚举】HR 的疑惑

题意

求出[1,n]中有多少个数能用a^b的形式来表示。

思路

n很大,所以我们尝试枚举指数,而且答案很小,我们对每个满足条件的数可以用map标记。
当我们发现b是合数时,ab=(ab/i)i,其中i为b的约数,所以我们枚举的指数是质数。

代码

#include 
#include  
#include 

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);
}

你可能感兴趣的:(枚举,数学)