天天看點

Codeforces 1445C Division

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

繼續閱讀