import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner sc =new Scanner(System.in);
//录入数据
int q = sc.nextInt();
long[][] arr = new long[q][2];
for (int i = 0;i < q;i++) {
for (int j = 0;j < 2;j++) {
arr[i][j] = sc.nextLong();
}
}
//循环遍历数组arr,目的:得到简化后的值
for (int i = 0;i < q;i++) {
//如果第一个值是1,直接输出1,否则进入方法shuchu(输出)
if (arr[i][0] == 1) {
System.out.println(1);
}else {
System.out.println(shuchu(arr[i][0],arr[i][1]));
}
}
}
//找到简化后的值
public static long shuchu(long a,long b) {
//处理当第一个值为2时的情况
if (a == 2) {
if (b > 1) {
return 1;
}else {
return 2;
}
}
//定义数组arr,存储素因子
long[] arr = new long[(int)Math.sqrt(a) + 10];
//定义s,临时存储第一个值
long s = a;
//定义ii,作为数组arr的下标
int ii = 0;
//循环得到素因子数组
while (s != 1) {
//循环得到素因子存进arr
for (int i = 2;i < a;i++) {
//如果i为素数,并且i是s的因子
if (sushu(i) && i * (s / i) == s) {
//将i存进数组,ii自加1
arr[ii] = i;
ii++;
//临时的第一个值除以i
s /= i;
//得到素因子后,退出循环,进行下一次的素因子寻找
break;
}
}
}
//定义ls等于0,当arr[ls]等于0时,说明素因子已经遍历完毕
int ls = 0;
//定义o,作为不同素因子的下标
int o = 0;
//循环简化a
while (arr[ls] != 0) {
//定义num作为素因子
long num = arr[o];
//定义count为素因子的个数
int count = 0;
//循环遍历arr得到素因子的个数
for (int i = 0;i < ii;i++) {
//如果arr[i]等于1,说明已经遍历过,跳过本次循环
if (arr[i] == 1) {
continue;
}
//如果arr[i]不等于num,说明不是要找的素因子,跳过
if (arr[i] != num) {
o = i;
continue;
}
//如果arr[i]等于num
if (arr[i] == num) {
//将arr[i]更新为1
arr[i] = 1;
//素因子的个数自增1
count++;
//确定素因子遍历玩的标志ls自增1
ls++;
}
}
//如果素因子的个数不等于0,并且小于第二个值
if (count != 0 && count < b) {
//第一个值除以该素因子的乘积
a /= (int)Math.pow(num, count);
}
}
//返回化简后的值
return a;
}
//判断是否是素数
public static boolean sushu(long x) {
boolean flag = true;
for (int i = 2; i < Math.sqrt(x); i++) {
if (x % i == 0) {
flag = false;
}
}
return flag;
}
}
CCFCSP202312-2因子化简java(暴力)(80分)
于 2023-12-10 20:10:49 首次发布