直接法,笨比代码
#include <cstdio>
#include <cmath>
#include <unordered_map>
using namespace std;
using ull = unsigned long long;
// Function to check if a number is a prime factor
inline bool is_factor(ull x) {
for (ull i = 2; i * i <= x; ++i)
if (x % i == 0)
return false;
return true;
}
int main() {
unsigned q, k;
// Number of test cases
scanf("%u", &q);
while (q--) {
// Input n and k for each test case
ull n, res;
scanf("%llu %u", &n, &k);
// map to store prime factors and their exponents
unordered_map<ull, unsigned> map;
// Factorizing n and storing its prime factors and exponents in map
while (n != 1) {
if (is_factor(n)) {
map[n]++;
break;
}
for (ull i = 2; i <= n; ++i)
if (is_factor(i) && n % i == 0) {
n /= i;
map[i]++;
break;
}
}
res = 1;
// Calculating the result for each prime factor in the map
for (auto & item : map) {
if (item.second >= k) {
// If the exponent is greater than or equal to k, multiply the result by the prime factor raised to the power of its exponent
res *= pow(item.first, item.second);
}
}
// Output the result for the current test case
printf("%llu\n", res);
}
return 0;
}