codeforces 1445 C Division (质因数分解)
作者:互联网
题面
题意
t组样例,每组给定一个p,q 找到一个最大的x,满足 p%x==0 && x%q !=0
题解
- 对于p%q != 0 那么 x 最大就是 p
- 对于p%q ==0 ,我们就可以将 x=p 变小,来满足条件,因为要满足条件1,所以x变小的只能是p的因子倍,要满足条件2,而且要最大,(q,p共有的因子)我们只需要将x的因子幂减少到q的因子幂少1,就是最大的答案
3.举个例子,因为p%q ==0 所以 q有的质因子p都有 ,假设 q=40=23 * 5 , p=240 = 24 *3 *5 , 我们只需要让p的质因子2 的次幂比q的质因子2少1即可,意思就是让4变为2,那么p就变成了p=60 = 22 *3 *5,然后看下一个质因子3,其中没有3,不是共有的,再看下一个5,只需要比q中的1少1,p就变成了48,所以最大的x应该为60
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> PLL;
const int N = 1e6 + 10;
ll t, p, q, cnt;
ll primes[N];
bool st[N];
//线性筛
void get_primes() {
for (int i = 2; i <= N; i++) {
if (!st[i]) primes[cnt++] = i;
for (int j = 0; primes[j] <= N / i; j++) {
st[primes[j] * i] = true;
if (i % primes[j] == 0) break;
}
}
}
//快速幂
ll qmi(ll m, ll k) {
ll res = 1;
while (k) {
if (k & 1) res = res * m;
m = m * m;
k >>= 1;
}
return res;
}
int main() {
cin >> t;
while (t--) {
cin >> p >> q;
if (p % q != 0) {
cout << p << endl;
continue;
}
vector<PLL> vp, vq;
//分解q的质因子
for (int i = 2; i <= q / i; i++) {
if (q % i == 0) {
ll s = 0;
while (q % i == 0) q /= i, s++;
vq.push_back({i, s});
}
}
if (q > 1) vq.push_back({q, 1});
ll pp = p;
//分解p的质因子 (只分解和q共有的)
for (int i = 0; i < vq.size(); i++) {
ll s = 0;
while (pp % vq[i].first == 0)pp /= vq[i].first, s++;
vp.push_back({vq[i].first, s});
}
ll minn = 1e18;
//遍历所有质因子,找到比q少一最小的值
for (int i = 0; i < vp.size(); i++) {
minn = min(minn, qmi(vp[i].first, vp[i].second - vq[i].second + 1));
}
cout << p / minn << endl;
}
return 0;
}
标签:Division,因数分解,int,++,ll,因子,vq,1445,primes 来源: https://blog.csdn.net/qq_44791484/article/details/113687917