我是靠谱客的博主 明理白云,最近开发中收集的这篇文章主要介绍Codeforces 1445C. Division(分解质因数)Codeforces 1445C. Division,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Codeforces 1445C. Division

题目大意

  • 给出 p , q p,q p,q,求最大的 x x x使得 x x x能被 p p p整除但 q q q不能被 x x x整除。
  • p ≤ 1 0 18 pleq 10^{18} p1018 2 ≤ q ≤ 1 0 9 2leq qleq 10^9 2q109

题解

  • 可以先令 x = p x=p x=p,若不满足第二个条件则不断把 x x x改小,
  • 显然为了满足 x x x仍旧是 p p p的约数,每次要让 x x x除以某个数,
  • 为了让第二个条件成立,需要 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>
using namespace std;
#define ll long long
int main() {
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("%lldn", t);
}
return 0;
}

最后

以上就是明理白云为你收集整理的Codeforces 1445C. Division(分解质因数)Codeforces 1445C. Division的全部内容,希望文章能够帮你解决Codeforces 1445C. Division(分解质因数)Codeforces 1445C. Division所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部