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