奥列格最喜欢的科目是历史和数学,而他最喜欢的数学分支是除法。
为了提高他的除法技巧,奥列格想出了t对整数pi和qi,并决定为每对整数找到最大的整数xi,这样。
pi能被xi整除。
xi不能被qi整除。
奥列格非常擅长除法,很快就找到了所有的答案,你呢?
输入
第一行包含一个整数t(1≤t≤50)--配对的数量。
接下来的t行包含两个整数pi和qi(1≤pi≤1018;2≤qi≤109)--第i对整数。
输出
打印t个整数:第i个整数是最大的xi,使pi能被xi整除,但xi不能被qi整除。
我们可以证明,在给定的约束条件下,总有至少一个xi的值满足可分条件。
例子
输入
3
10 4
12 6
179 822
输出
10
4
179
注意
对于第一对,p1=10,q1=4,答案是x1=10,因为它是10的最大除数,而且10不能被4整除。
对于第二对,p2=12,q2=6,注意
12不是一个有效的x2,因为12可以被q2=6整除。
6也不是有效的x2。6也不是有效的x2:6也能被q2=6所除。
p2=12的下一个除数是4,这就是答案,因为4不能被6所除。
题解:
如果p%q != 0,那么直接输出p即可
任何一个正整数可以分解为一些质数的次方相乘
p = a1^k1*a2^k2......ai^ki
q = a1^k1*.....ai^ki
如果p%q == 0
说明q里面分解后的质数p里面都有,
那么我们就一个个先找出q的质数,然后check
void check(int x)
{
long long t = p;
while(t%q == 0)
{
t/=x;
}
ans = max(ans,t);
}
把p里面的质数x除到t%q!=0
#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
#include<vector>
#include<cstring>
#include<stack>
using namespace std;
long long p,q,ans;
void check(int x)
{
long long t = p;
while(t%q == 0)
{
t/=x;
}
ans = max(ans,t);
}
void solve()
{
cin >> p >> q;
if(p%q)
{
cout<<p<<"\n";
return ;
}
long long x = q;
ans = 0;
for(int i = 2;i*i <= x;i++)
{
if(x % i == 0)
{
check(i);
}
while(x%i == 0)
x/=i;
}
if(x > 1)
{
check(x);
}
cout<<ans<<"\n";
}
int main()
{
int t = 1;
cin >> t;
while(t--)
{
solve();
}
}
//
//abcdef
//babcdef
//1110011
//p%x == 0
//x%q != 0
//k*q + (1~q-1)