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 依然很慢,求教大佬为啥这样变快了呢