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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值