Codeforces Round #680A
大意
给定 (p) 和 (q) ((1leq p leq 10^{18};1 leq q leq 10^9))。
求最大的(x),要求 (xmid p) 并且 (q mid x)。
思路
这题证明了我是真的菜...
第一种情况 (q mid p)
显然答案就是(p)
第二种情况 (q mid p)
记(c = p/q)
考虑因式分解,设(r)为(q)的一个素因子。
(ecause q mid (q/r))
所以将(c)因子中的(r)都丢掉,即 $c' mid c $ , (r mid c') 且 (c'*r^k = c)
答案显然就是 (max(c'_i*q/r_i)) , (r_i) 为 (q) 的第 (i) 个素因子。
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;
int t;
ll p, q;
ll sol(ll div) {
if(div==1) return 1;
// cout << div << endl;
ll tmp = p/q;
while(!(tmp%div)) tmp /= div;
return tmp*q/div;
}
int main() {
cin >> t;
while(t--) {
cin >> p >> q;
ll ans = 0;
if(p%q) {cout << p << endl; continue;}
else for(ll i = 1; i <= (int)sqrt(q)+1; i++)
if(!(q%i)) {
ans = max(ans, max(sol(i), sol(q/i)));
}
if(!ans) ans = p/q;
cout << ans << endl;
}
return 0;
}