为了让第二个条件成立,需要
q
q
q分解质因数后某一项
c
k
c^k
ck在
x
x
x中只有
c
k
′
(
k
′
<
k
)
c^{k'}(k'<k)
ck′(k′<k),
而且为了
x
x
x尽可能大,所以只需要某一个质因数满足即可,
那么枚举
q
q
q的每个质因数,把
x
x
x一直除以它直到条件成立,在所有这样操作后的
x
x
x中取最大值。
代码
#include<cstdio>#include<cstring>#include<algorithm>usingnamespace std;#define ll long longintmain(){int tn;scanf("%d",&tn);while(tn--){
ll p, q, i;scanf("%lld%lld",&p,&q);
ll Q = q;
ll t =0;for(i =2; i * i <= q; i++)if(q % i ==0){while(q % i ==0) q /= i;
ll ss = p, l =1;while(ss % Q ==0&& ss % i ==0) ss /= i, l *= i;
t =max(t, ss);}if(q >1){
ll ss = p, l =1;while(ss % Q ==0&& ss % q ==0) ss /= q, l *= q;
t =max(t, ss);}printf("%lld
", t);}return0;}