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