4 条题解
-
0
#include <iostream> using namespace std;
int gcd(int a,int b) { if(b == 0) return a; else return gcd(b,a % b); }
int main() { int x0,y0,cnt = 0; cin >> x0 >> y0; if(y0 % x0 != 0) { cout << 0; return 0; } for(int i = x0;i <= y0;i += x0) { int j = x0 * y0 / i; if(j * i != x0 * y0) continue;
if(gcd(i,j) == x0) { cnt++; cout << i << ' ' << j << endl; } } cout << cnt; return 0;
}
一个比较麻烦,但比较容易理解的办法
首先,输入x0,y0以后先进行一次特判,因为如果有多组数据同时满足最小公倍数为y0,最大公约数为x0的话, 那么x0,y0以及y0,x0这两组数据是绝对满足的,当y0,x0这组数据不满足情况时,其它数据也不会满足
然后,枚举Q和N,根据前面推出的x0,y0和y0,x0一定满足情况可以进一步推出Q和N的取值范围为x0~y0,这里先枚举Q
根据 最小公倍数 = Q * N / 最大公约数 可以得到 N = 最小公倍数 * 最大公约数 / Q = x0 * y0 / Q 因为N,Q都是int类型,C++在计算整数相除时会向下取整,所以算完以后先要判断Q * N == x0 * y0是否成立然后再判断
然后计算两数的最大公约数,这里采取辗转相除法来求最大公约数(当然,也可以用枚举,但时间复杂度会更高), 当这两个数满足 最大公约数 == x0 时,说明满足情况,答案+1
这里不需要判断两数的最小公倍数,因为最小公倍数和最大公约数(x0,y0)都是确定的值,Q是枚举出来的,也可以当作定值,也就是说,只要Q,N都为整数且相乘=x0 * y0,那么Q和N的最小公倍数一定为y0
- 1
信息
- ID
- 1514
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 330
- 已通过
- 183
- 上传者