【做题记录】CF1444A Division

CF1444A Division

题意:

给定 (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;
}
原文地址:https://www.cnblogs.com/EricQian/p/15314196.html