Codeforces 1445C Division
链接
http://codeforces.com/contest/1445/problem/C
题目大意
一共t组数据,每组数据
给你两个整数p,q,找出一个最大的整数x,使得 p能整除x,x不能整除q。
(即: p % x ==0 , x % q != 0 )
输入输出
Input
3
10 4
12 6
179 822
Output
10
4
179
数据范围
1<=t<=50, 1<=p<=1e18,1<=q<=1e9
思路
显然,当 p与q不满足整除关系(p%q != 0) 时,最大的x就是p本身,这个简单。
但是当 p % q == 0 时怎么办呢?
不难发现,当 p % q == 0 时,
我们令 q = A * B ,
则 p = An * Bn * C , 其中C是一个与A,B均不满足整除关系的整数。
那么,从每一个 x = p / An 中找到的x(max)不就是结果了吗?
显然,A、B的集合就是q的所有因子,我们只需要O(sqrt(n))的时间来找出它们。
对于An,我们只需要让p不断的除以因子A直到p不再能被q整除就行了。
example:
6 = 2 * 3;
6 = 1 * 6;
168 = 23 * 31 * 7;
168 = 11 *61 * 28;
PS: 上一次更新啊,那是一年前的事儿了~~~~
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll p,q;
ll ans = 0;
ll solve(ll x){
if(x==1)
return x;
ll t=p;
while(t%q==0)
t/=x;
return t;
}
void pre (ll x)
{
for(ll i=1;i*i<=x;i++){
if(x%i==0)
{
ll a=i,b=x/i;
ans = max(ans,solve(a));
ans = max(ans,solve(b));
}
}
}
int main(){
int t;
cin>>t;
while(t--){
ans = 0;
scanf("%lld %lld",&p,&q);
pre(q);
if(ans!=0)
printf("%lld\n",ans);
else
printf("1\n");
}
return 0;
}