标签:span ace clu sqrt https tmp 否则 不能 pac
首先判断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 \times2 \times3 \times3\) , \(q_i=2 \times2 \times3\),将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;
}
}
}
[Codeforces Round #680] C. Division
标签:span ace clu sqrt https tmp 否则 不能 pac
原文地址:https://www.cnblogs.com/kksk/p/13925280.html