Codeforces Round #680
C. Division
首先判断pi能否整除qi,不能这答案就是pi,否则,将(q_i)分解质因数,将qi的每个因子从pi中剔除成不能被(q_i)整除的数,pi剔除完后就是(x_i),且(x_i)不能被(q_i)。记录个最大的(x_i)
举例说明 (p_i=36),(q_i=12),(p_i=2 imes2 imes3 imes3) , (q_i=2 imes2 imes3),将qi的每个因子 (2) ,(2), (3)从pi中剔除成为不能被(q_i)整除,即是每个(x_i),记录下最大的(x_i)。
#include <iostream>
#include <cmath>
#include <cstring>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e9;
int t,isprime[100000];
ll p,q;
vector <ll> v;
vector <pair<ll,ll> >z;
pair<ll,ll>tmp;
void sieve(){
for(int i=0;i<=sqrt(N);i++)
isprime[i]=true;
isprime[0]=isprime[1]=false;
for(int i=2;i<=sqrt(N);i++){
if(isprime[i]){
v.push_back(i);
for(int j=i+i;j<=sqrt(N);j+=i){
isprime[j]=false;
}
}
}
}
int main(){
cin>>t;
sieve();
while(t--){
cin>>p>>q;
ll go=q;
z.clear();
for(int i=0;i<v.size();i++){
int ok=0;
while(q%v[i]==0){
ok++;
q/=v[i];
}
if(ok){
z.push_back({v[i],ok});
}
}
if(q!=1){
z.push_back({q,1});
}
if(p%go!=0){
cout<<p<<endl;
}else{
ll ans=0;
for(int i=0;i<z.size();i++){
//cout<<"z="<<z[i]<<" "<<p<<endl;
tmp=z[i];
ll lin=p,zz=tmp.first,cnt=tmp.second-1;
while(lin%zz==0){
lin/=zz;
}
while(cnt--){
lin*=zz;
}
ans=max(ans,lin);
}
cout<<ans<<endl;
}
}
}