【做题记录】CF1444A Division

CF1444A Division

题意:

给定 \(t\) 组询问,每组给两个数 \(p_i\)\(q_i\) ,找出最大的整数 \(x_i\) ,要求 \(p_i\) 可被 \(x_i\) 整除,且 \(x_i\) 不可被 \(q_i\) 整除 。

题解:

呜呜呜这道题总共算下来我爆了 \(15\)\(\dots\) 妥妥掉分

  • \(p\nmid q\) :显然答案为 \(p\)

  • \(p\mid 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\n",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\n",ans);
		 }
	 }
     //fclose(stdin);
     //fclose(stdout);
     return 0;
}
posted @ 2021-09-20 14:01  EricQian06  阅读(34)  评论(0编辑  收藏  举报