题解:
通过质数筛法,用个板子函数就行了,计算出质数系数就行了
#pragma GCC optimize(2, 3, "Ofast", "inline")
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
long long int num;
const int MAXN = 10000;
int prime[MAXN + 1];
void getPrime()
{
memset(prime, 0, sizeof(prime));
for (int i = 2; i <= MAXN; i++)
{
if (!prime[i])
prime[++prime[0]] = i;
for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++)
{
prime[prime[j] * i] = 1;
if (i % prime[j] == 0)
break;
}
}
}
//factors[i][0]表示大数的第i个质因子是什么
//factors[i][1]表示大数的第i个质因子的系数是多少
long long factor[100][2];
//不同质因子的个数
int fatCnt;
int getFactors(long long x)
{
fatCnt = 0;
long long tmp = x;
for (int i = 1; prime[i] <= tmp / prime[i]; i++)
{
factor[fatCnt][1] = 0;
if (tmp % prime[i] == 0)
{
factor[fatCnt][0] = prime[i];
while (tmp % prime[i] == 0)
{
factor[fatCnt][1]++;
tmp /= prime[i];
}
fatCnt++;
}
}
if (tmp != 1)
{
factor[fatCnt][0] = tmp;
factor[fatCnt++][1] = 1;
}
return fatCnt;
}
void work()
{
getPrime();
int q;
cin >> q;
int k;
while (q--)
{
cin >> num >> k;
// cout << getFactors(num) << endl;
int yinzi_nums=getFactors(num);
for (int i = 0; i < yinzi_nums; i++)
{
if(factor[i][1]<k)
{
num/=pow(factor[i][0],factor[i][1]);
}
}
cout<<num<<endl;
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
work();
return 0;
}