PROBLEM E: 同源數

Description

如果x和y的質因子集合完全相同,那麼我們就說他們是同源的。比如說18 = 2 * 32,12 = 3 * 22;

Input

本題有多組數據(組數 <= 555555)。每組數據輸入形如:x yx, y爲整數(1 <= x, y <= 1e18)

Output

輸出形入:ans如果x, y爲同源數,那麼ans爲”Yes”, 不然爲”No”.

Sample Input

18 12
2 3

Sample Output

Yes
No

思路:最開始是想用分解質因數去做,然後發現sqrt(n)是1e9還是不過的

所以轉化一下思路。根據質因數分解定理,我們令x=(p1^k1)*(p2^k2)*(p3^k3)…(pn^kn);令y=(q1^u1)(q2^u2)(q3^u3)….(qn^un);

那麼他們的最大公約數肯定是在每個相同的pn和qn中找,並且找他們的次方數最小的取出來是最大公因數。

那麼問題是,這個取出來後,x/=t(令t=gcd(x,y));剩下的這個x中可能還是有和t相同的因數,只不過第一次算gcd(x,y)取的是最小次數。

那我們看看剩下的x裏面有沒有和t不同的質因數(如果還有和t相同的質因數我們可以通過gcd(t,x/=t)來消去,消除到最後看看是否gcd(t,x/=t)爲1就是互質,是的話就肯定這個質因數是x是特有的質因數。也就是說這個質因數不會出現在y中,那麼x和y就不是同源數了。

小結一下:質因數分解可以通過觀察gcd去做,思考的時候用質因數分解定理加模擬去思考

#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5;
typedef long long LL;
LL gcd(LL a,LL b)
{
	return b?gcd(b,a%b):a;
}
int main(void)
{
	//cin,cout可能會TLE 
//	cin.tie(0);ios::sync_with_stdio(false);
	LL x,y;
	while(~scanf("%lld %lld",&x,&y))
	{
		LL t=gcd(x,y);
		x/=t;
		y/=t;
		long long n=0; 
		while(x!=1)
		{
			n=gcd(x,t);
			if(n==1) break;//剩下的x裏面有互質的數 直接跳出,不然死循環 
			x/=n;
		}
		while(y!=1)
		{
			n=gcd(y,t);
			if(n==1) break;
			y/=n;
		}
		if(x==1||y==1)//和最大公約數的因子都一樣 
		{
			printf("Yes\n"); 
		}
		else printf("No\n");
	}

return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章