欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-16 11:18:50
...

洛谷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;	
} 
相关标签: 基础数学问题