codeforces Round680 C. Division 题解
题目
Oleg’s favorite subjects are History and Math, and his favorite branch of mathematics is division.
To improve his division skills, Oleg came up with ttt pairs of integers pip_ipi and qiq_iqi and for each pair decided to find the greatest integer xix_ixi, such that:
- pip_ipi is divisible by xix_ixi;
- xix_ixi is not divisible by qiq_iqi.
Oleg is really good at division and managed to find all the answers quickly, how about you?
Input
The first line contains an integer ttt (1≤t≤50)(1≤t≤50)(1≤t≤50) — the number of pairs.
Each of the following ttt lines contains two integers pip_ipi and qiq_iqi (1≤pi≤1018;2≤qi≤109)(1≤ p_i≤10^{18}; 2≤q_i≤10^9)(1≤pi≤1018;2≤qi≤109)— the i−thi-thi−th pair of integers.
Output
Print ttt integers: the i−thi-thi−th integer is the largest xix_ixi such that pip_ipi is divisible by xix_ixi, but xix_ixi is not divisible by qiq_iqi.
One can show that there is always at least one value of xix_ixii satisfying the divisibility conditions for the given constraints.
Example
input
3
10 4
12 6
179 822
output
10
4
179
Note
For the first pair, where p1=10p_1=10p1=10 and q1=4q_1=4q1=4, the answer is x1=10x_1=10x1=10, since it is the greatest divisor of 101010 and 101010 is not divisible by 444.
For the second pair, where p2=12p_2=12p2=12 and q2=6q_2=6q2=6, note that
- 121212 is not a valid x2x_2x2, since 121212 is divisible by q2=6q_2=6q2=6;
- 666 is not valid x2x_2x2 as well: 666 is also divisible by q2=6q_2=6q2=6.
The next available divisor of p2=12p_2=12p2=12 is 444, which is the answer, since 444 is not divisible by 666.
题意
找一个最大的xxx,满足p % x==0 and x % q!=0p\ \%\ x == 0 \ and\ x\ \%\ q != 0p % x==0 and x % q!=0。
思路
质因数分解
- p % q != 0p\ \%\ q\ !=\ 0p % q != 0, x=px = px=p
- p % q = 0p\ \%\ q\ =\ 0p % q = 0 , 那么ppp一定包含qqq的所有质因数分解的结果。
举例:
p=12 q=6p = 12\ \ q = 6p=12 q=6
p=22∗31p = 2^2 * 3^1p=22∗31 q=21+31q = 2^1 +3^1q=21+31
要使p % q != 0p\ \%\ q\ !=\ 0p % q != 0, 只要使 ppp 将质因数222降幂到000(也就是q的质因数222的次幂之下),或者将333 的幂降到000。
所以,我们只需要枚举qqq的质因子, 找权值最小的,即为答案。
代码
#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
#define IOS ios_base::sync_with_stdio(0); cin.tie(0);cout.tie(0);
const int maxn = 2e5 + 10;
int ans[maxn];
void solve(){
ll p, q;
cin >> p >> q;
if(p % q) { //p不能被q整除,答案就是p
cout << p << endl;
return;
}
ll ans = 0;
for (ll i = 1; i * i <= q; i++){
if(q % i) continue; // 不是q的因子
//i 和 q/i 都是因子
ll t = p;
if(i != 1){
while(t % q == 0) t /= i;
ans = max(ans, t);
}
t = p;
while(t % q == 0) t /= (q / i);
ans = max(ans, t);
}
cout << ans << endl;
}
int main(){
IOS; int t; cin >> t;
while(t--){
solve();
}
return 0;
}