Codeforces Round #680 (Div. 2, based on Moscow Team Olympiad)C. Division
题意
让你找到最大的
x
x
x满足
p
i
%
x
=
=
0
x
%
q
i
!
=
0
p_i \% x == 0\\ x \% q_i !=0
pi%x==0x%qi!=0
思路
分为三类情况:
如果 p < q p < q p<q,那么直接输出 p p p
如果 p % q ! = 0 p\%q!=0 p%q!=0,也是直接输出 p p p
当 p % q = = 0 p\%q==0 p%q==0时,我们需要将 p p p化为 p % q ! = 0 p\%q!=0 p%q!=0的最大数,即为所求。
看到数据范围,我们考虑枚举q的因子。(分解质因数)
然后在想到约数定理,每个数必然是一系列素数的乘积。(分解质因数)
我们把 p , q p,q p,q都分解为素数的乘积。
要使 p % q ! = 0 , p\%q!=0, p%q!=0,那么我们一定是要让 p p p除以 q q q的素因子
让
p
p
p和
q
q
q中相同素数的次幂中,
p
p
p的小于
q
q
q的即可符合
p
%
q
!
=
0
p\%q!=0
p%q!=0
P
=
p
1
a
1
×
p
2
a
2
×
p
3
a
3
∗
…
∗
p
k
a
k
Q
=
q
1
a
1
×
q
2
a
2
×
q
3
a
3
∗
…
∗
q
k
a
k
P=p_1^{a1}×p_2^{a2}×p_3^{a3}*…*p_k^{ak}\\ Q=q_1^{a1}×q_2^{a2}×q_3^{a3}*…*q_k^{ak}
P=p1a1×p2a2×p3a3∗…∗pkakQ=q1a1×q2a2×q3a3∗…∗qkak
让P的素数次幂小于Q的素数次幂,则
p
%
q
!
=
0
p\%q!=0
p%q!=0
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve() {
int p, q; cin >> p >> q;
vector<int>fac;
if(p < q) {
cout << p << endl;
}
else {
if(p % q != 0) cout << p << endl;
else {
int n = sqrt(q);
int t = q;
for (int i = 2; i <= n; ++i) {
if(t % i ==0) {
fac.push_back(i);
while (t % i == 0) t /= i;
}
}
if(t > 1) fac.push_back(t);
int ans = 1;
for (int i = 0; i < fac.size(); ++i) {
t = p;
while (t % q == 0) t /= fac[i];
ans = max(ans, t);
}
cout << ans << endl;
}
}
}
signed main() {
int t; cin >> t;
while (t--) {
solve();
}
}