Codeforces Round #680 (Div. 2)C. Division

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×p3a3pkakQ=q1a1×q2a2×q3a3qkak
让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();
    }

}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值