为了让第二个条件成立,需要 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\n", t);}return0;}