题意:
给定 (t) 组询问,每组给两个数 (p_i) 和 (q_i) ,找出最大的整数 (x_i) ,要求 (p_i) 可被 (x_i) 整除,且 (x_i) 不可被 (q_i) 整除 。
题解:
呜呜呜这道题总共算下来我爆了 (15) 发 (dots) 妥妥掉分
-
(p mid q) :显然答案为 (p) 。
-
(pmid q) :枚举每个 (q) 的因子 (d) ,将 (p) 一直除 (d) 直到不能被 (q) 整除为止,余数就是对应的答案 。最终答案就是所有余数中算出来的答案取 (max) 。
为什么这是正确的:因为使劲除完 (d) 以后的余数一定是 (p) 的因子,且一定不被 (q) 整除 。
代码:
#include<bits/stdc++.h>
using namespace std;
#define Maxn 105
typedef long long ll;
ll maxll(ll x,ll y){ return x>y?x:y; }
ll t,p,q,ans;
ll cnt(ll x)
{
ll tmp=p;
while(tmp%q==0) tmp/=x;
return tmp;
}
int main()
{
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&p,&q),ans=1;
if(p%q) printf("%lld
",p);
else
{
for(ll i=2;i*i<=q;i++) if(q%i==0)
ans=maxll(ans,cnt(i)),ans=maxll(ans,cnt(q/i));
ans=maxll(ans,cnt(q));
printf("%lld
",ans);
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}