题解:P1029 [NOIP 2001 普及组] 最大公约数和最小公倍数问题
GoldenSTEVE7 · · 题解
题目大意
给定
思路
首先一看到这是一道有关于
欧几里得算法
其实这就是一个很简单的港式大家记住就行:
那么我们把这个操作进行很多很多次,直到其中一个为
小结论
下面是一个再次体重要用到的结论:
随手证明一下吧。我们设:
这里,
由于
代入到左式
得证。
接下来,我们正式开始做这道题。
首先,题目给出了
考虑优化。
由于对于每一组 i <= sqrt(n),而是 i * i <= n,这样精度会好些)
再者,有一些数据会使得
代码
接下来就是代码咯
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a % b);}
ll lcm(ll a, ll b) {return a * b / gcd(a, b);}
int main() {
ll x, y, ans;
cin >> x >> y; x *= y;
for(ll i = 1; i * i <= x; i++) {
if(!(x % i)) {
ll a = i, b = x/i;
if(lcm(a, b) == y) {
if(a != b) ans++;
ans++;
}
}
}
cout << ans;
return 0;
}