zoukankan      html  css  js  c++  java
  • codeforces Round680 C. Division 题解

    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 (t) pairs of integers (p_i) and (q_i) and for each pair decided to find the greatest integer (x_i), such that:

    • (p_i) is divisible by (x_i);
    • (x_i) is not divisible by (q_i).

    Oleg is really good at division and managed to find all the answers quickly, how about you?

    Input

    The first line contains an integer (t) ((1≤t≤50)) — the number of pairs.

    Each of the following (t) lines contains two integers (p_i) and (q_i) ((1≤ p_i≤10^{18}; 2≤q_i≤10^9))— the (i-th) pair of integers.

    Output

    Print (t) integers: the (i-th) integer is the largest (x_i) such that (p_i) is divisible by (x_i), but (x_i) is not divisible by (q_i).

    One can show that there is always at least one value of (x_i)i 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 (p_1=10) and (q_1=4), the answer is (x_1=10), since it is the greatest divisor of (10) and (10) is not divisible by (4).

    For the second pair, where (p_2=12) and (q_2=6), note that

    • (12) is not a valid (x_2), since (12) is divisible by (q_2=6);
    • (6) is not valid (x_2) as well: (6) is also divisible by (q_2=6).

    The next available divisor of (p_2=12) is (4), which is the answer, since (4) is not divisible by (6).

    题意

    找一个最大的(x),满足(p \% x == 0 and x \% q != 0)

    思路

    质因数分解

    • (p \% q != 0)(x = p)
    • (p \% q = 0) , 那么(p)一定包含(q)的所有质因数分解的结果。

    举例:

    (p = 12 q = 6)
    (p = 2^2 * 3^1) (q = 2^1 +3^1)

    要使(p \% q != 0), 只要使 (p) 将质因数(2)降幂到(0)(也就是q的质因数(2)的次幂之下),或者将(3) 的幂降到(0)

    所以,我们只需要枚举(q)的质因子, 找权值最小的,即为答案。

    代码

    #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;
    }
    
  • 相关阅读:
    以后面试官再问你三次握手和四次挥手,直接把这一篇文章丢给他
    聊聊面试中常问的GC机制
    四面快手、终拿Offer,想告诉你的一些事情
    深入浅出14个Java并发容器
    Dubbo 在 K8s 下的思考
    一文带你深入浅出Spring 事务原理
    如何高效选择一款消息队列?
    当面试官要你介绍一下MQ时,该怎么回答?
    淘宝双11促销背后采用什么架构技术来实现网站的负载均衡
    Android 更改按钮样式 Button Styles
  • 原文地址:https://www.cnblogs.com/fans-fan/p/13920441.html
Copyright © 2011-2022 走看看