洛谷p1029 最大公约数与最小公倍数问题

在这里插入图片描述

题目分析

题目难度:普及-
朴素暴力的想法是来一个二重循环,但显然会TLE,所以要寻求最大公约数gcd与最小公倍数lcm之间的关系。

预备知识

设x=gcd(p,q),y=lcm(p,q)
则 x*y = p*q
证明:设 A=p/x,B=q/x,则A与B互质
(A与B互质,即gcd(A,B)=1。如果两者不互质,则说明A与B之间的最大公约数会大于x,与前提矛盾)
然后有 y=A*B*x (想一想,x是p与q的最大公约数,A是p中独有的因数,B是q中独有的因数,故两者的最小
公倍数必然等于 p与q中独有的因数的乘积再乘上两者的最大公约数。)
所以,x*y=p*q

所以对p进行枚举,从1~y之间的所有数,如果x * y可以整除p 且 gcd(p,x*y/q)=x,则这是一组解。
简单的优化是y可以进行缩小到sqrt(x * y),且对p进行枚举的时候可以直接从x开始,然后加法步长是x

AC代码
#include<bits/stdc++.h>
using namespace std;

int gcd(int a,int b)
{//返回两个数的最大公约数
	while(b)
	{
		int mod = a%b;
		a = b;
		b = mod;
	}
	return a;
}
int lcm(int a,int b,int Gcd)
{  //返回两个数的最小公倍数
	return a*b/Gcd;
}
int x,y;
int main()
{
	cin>>x>>y;
	int ans = 0;
	if(x>y)    // 让x一直小于y
		{
			int temp = x;
			x = y;
			y = temp;
		}
	for(int i=x;i<=y;i+=x)
		if(x*y%i==0 && gcd(i,x*y/i)==x) 
			ans++;
	cout<<ans;	
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值