
奥列格最喜欢的科目是历史和数学,而他最喜欢的数学分支是除法。
为了提高他的除法技巧,奥列格想出了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)