思路
可以发现,当
p
p
p 不是
q
q
q 倍数的时候,答案就是
p
p
p,否则的话就需要找一找,那么对于
p
p
p 是
q
q
q 的倍数,相当于
p
p
p 包含了
q
q
q 的所有质因子。
那么需要找一个
p
p
p 的因子,且 不能被
q
q
q 整除,且要最大。那么对于
q
q
q 质因数分解,得到如下形式 :
q
=
p
1
k
1
∗
p
2
k
2
.
.
.
∗
p
t
k
t
q = p_1^{k_1}*p_2^{k_2}...*p_t^{k_t}
q=p1k1∗p2k2...∗ptkt,显然
p
p
p 肯定包含这些质因数(次数),那么让
x
x
x 不能被
q
q
q 整除,即只需满足
x
x
x 的质因数分解里与
q
q
q 的质因数分解里,某个质因数的幂为
k
t
−
1
k_t-1
kt−1 就行了。
参考代码
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
const int man = 2e5+10;
#define IOS ios::sync_with_stdio(0)
#define ull unsigned ll
#define uint unsigned
#define pai pair<int,int>
#define pal pair<ll,ll>
#define IT iterator
#define pb push_back
#define fi first
#define se second
#define For(i,j,k) for (int i=(int)(j);i<=(int)(k);++i)
#define Rep(i,j,k) for (int i=(int)(j);i>=(int)(k);--i)
#define endl '\n'
#define ll long long
const ll mod = 1e9+7;
void slove(ll x,ll y){
ll ans = 0;
for(int i = 2;1ll*i*i<= y;++i){
if(y%i==0){
ll res = 1;
while(y%i==0)y/=i,res*=i;
ll tp = x;
res /= i;
while(tp%i==0)tp/=i;
ans = max(ans,tp*res);
// cout<<res <<endl;
}
}
if(y!=1){
while(x%y==0)x/=y;
ans = max(ans,x);
}
cout<<ans<<endl;
}
signed main() {
#ifndef ONLINE_JUDGE
//freopen("in.txt", "r", stdin);
//freopen("out.txt","w",stdout);
#endif
int t;
cin >> t;
while(t--){
ll x,y;
cin >> x >>y;
if(x%y==0){
slove(x,y);
}else cout<<x<<endl;
}
return 0;
}