P1029 最大公约数和最小公倍数问题 题解
upd on 2020/06/12:修改了部分解释不够清楚和有歧义的地方。
upd on 2022/07/21:添加了 Latex。
前置知识
- 最大公约数(即
\gcd ) 和最小公倍数(即\operatorname{lcm} )的求法。
该题的关键点在于,两个数的积等于它们最大公约数和它们最小公倍数的积。公式表示为
-
x \times y=P \times Q -
\gcd(x,y)=P -
\operatorname{lcm}(x,y)=Q
我们可以枚举
考虑优化这个程序。我们其实并不需要枚举两次,因为对于不同的
一组
一些代码实现技巧:
-
c++ 里有一个自带的求
\gcd 的函数叫__gcd。upd:现在 NOIP 已经可以使用了。 -
当积相同且
\gcd 相同时,\operatorname{lcm} 也一定相同,因此只需判断是否满足一、二两个条件即可。
AC 代码:(应该是目前最短的)
#include<bits/stdc++.h>
using namespace std;
long long m,n,ans;
int main(){
cin>>m>>n;
if(m==n) ans--;
n*=m;//把两数的积存入n中
for(long long i=1;i<=sqrt(n);i++){
if(n%i==0&&__gcd(i,n/i)==m) ans+=2;
}
cout<<ans;
return 0;
}
评论区常见问题统一回答:
Q:
A:是“最大公约数”的缩写。同理,
Q:代码中为什么枚举到
A:前文提到,我们要避免重复,因此循环时只算