为什么这样做可以变得很快
查看原帖
为什么这样做可以变得很快
255169
__LePetitPrince__楼主2023/11/1 00:21

AC:

#include <stdio.h>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
LL n, k;
LL sq, sqn;
map<LL, bool> h;
LL mypow(LL a, LL b) {
	LL ret = 1;
	for (int i = 1; i <= b; i++) {
		ret *= a;
	}
	return ret;
}
LL calc() {
	LL ret = 0;
	for (LL i = 2; i * i * i <= n; i++) {
		//LL a = mypow(i, k);
		LL a = i * i, m = 2;
		while (a <= n / i) {
			a *= i;
			m++;
			if (m < k) {
				continue;
			}
			if (h[a]) {
				continue;
			}
			if ((LL)sqrtl(a) * sqrtl(a) == a) {
				sqn++;
			}
			h[a] = true;
			ret++;
		}
	}
	return ret;
}
int main() {
	scanf("%lld%lld", &n, &k);
	if (k == 1) {
		printf("%lld", n);
		return 0;
	}
	if (k == 2) {
		sq = (LL)sqrtl(n);
		printf("%lld", sq + calc() - sqn);
	} else if (k >= 3) {
		printf("%lld", calc() + 1);
	}
	return 0;
} 

TLE 70:

#include <stdio.h>
#include <map>
#include <cmath>
using namespace std;
typedef long long LL;
LL n, k;
LL sq, sqn;
map<LL, bool> h;
LL calc() {
	LL ret = 0;
	for (LL i = 2; i * i * i <= n; i++) {
		LL a = pow(i, k);
		while (a <= n) {
			if (h[a]) {
				a *= i;
				continue;
			} else {
				if ((LL)sqrtl(a) * sqrtl(a) == a) {
					sqn++;
				}
				h[a] = true;
				ret++;
				a *= i;
			}
		}
	}
	return ret;
}
int main() {
	scanf("%lld%lld", &n, &k);
	if (k == 1) {
		printf("%lld", n);
		return 0;
	}
	if (k == 2) {
		sq = (LL)sqrtl(n);
		printf("%lld", sq + calc() - sqn);
	} else if (k >= 3) {
		printf("%lld", calc() + 1);
	}
	return 0;
} 

我觉得这两个没啥区别,一开始以为是 pow 太慢,自己写了 mypow 依然很慢,求教大佬为啥这样变快了呢

2023/11/1 00:21
加载中...