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;
}

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

被折叠的 条评论
为什么被折叠?



