C. Division

该博客是一个关于数学练习的问题,挑战者需要找到使给定整数对满足特定除法规则的最大整数。对于每对整数(p, q),目标是找到最大的x,使得p能被x整除,但x不能被q整除。题目提供了输入输出示例,并指出在给定约束下总能找到至少一个符合条件的x。" 103306038,8648286,Dockerfile 指令详解:打造 Docker Image,"['Linux', 'Docker']

https://codeforces.ml/contest/1445/problem/C

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 tt pairs of integers pipi and qiqi and for each pair decided to find the greatest integer xixi, such that:

  • pipi is divisible by xixi;
  • xixi is not divisible by qiqi.

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

Input

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

Each of the following tt lines contains two integers pipi and qiqi (1≤pi≤10181≤pi≤1018; 2≤qi≤1092≤qi≤109) — the ii-th pair of integers.

Output

Print tt integers: the ii-th integer is the largest xixi such that pipi is divisible by xixi, but xixi is not divisible by qiqi.

One can show that there is always at least one value of xixi satisfying the divisibility conditions for the given constraints.

Example

input

Copy

3
10 4
12 6
179 822

output

Copy

10
4
179

Note

For the first pair, where p1=10p1=10 and q1=4q1=4, the answer is x1=10x1=10, since it is the greatest divisor of 1010 and 1010 is not divisible by 44.

For the second pair, where p2=12p2=12 and q2=6q2=6, note that

  • 1212 is not a valid x2x2, since 1212 is divisible by q2=6q2=6;
  • 66 is not valid x2x2 as well: 66 is also divisible by q2=6q2=6.

The next available divisor of p2=12p2=12 is 44, which is the answer, since 44 is not divisible by 66.

 

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e7+10;
const int mod=1e9+7;
ll t,n,q,p;
ll cnt;
ll a[maxn],max1;
ll poww(ll a,ll b){
    ll ans=1,base=a;
    while(b!=0){
        if(b&1!=0)
        ans*=base;
        base*=base;
        b>>=1;
    }
    return ans;
}
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>p>>q;
        ll x,ans;
        max1=0;
        x=q;
        ans=p;
        if(p%q!=0)
            cout<<p<<endl;
        else
        {
            cnt=0;
            for(int i=2;i<=sqrt(x);i++)
            {
                if(x%i==0)
                {
                    cnt++;
                    a[cnt]=i;
                    while(x%i==0)
                        x/=i;

                }
            }
            if(x!=1)
            cnt++,a[cnt]=x;
            x=q;
            for(int k=1;k<=cnt;k++)
            {
                int i=a[k];
                if(x%i==0)
                {
                    ans=p;
                    int s=0;
                    while(x%i==0)
                    {
                        x/=i;
                        s++;
                    }
                    while(ans%i==0)
                    {
                        ans/=i;
                    }
                    ans=ans*poww(i,s-1);
                    max1=max(ans,max1);
                }
            }
            cout<<max1<<endl;
        }

    }
    return 0;
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值