# 神奇的数字对 ## 题目描述 在遥远的国度上面存在着很多个神奇的数字,这些数字都是成对出现的,每一对数字之中将第一个数字叫做 $P$ 数字,第二个数字叫做 $Q$ 数字。 其中每一对神奇的数字都满足 $P$ 数字和 $Q$ 数字的最大公约数是 $M$ ,最小公倍数是 $N$ ;并且 $P$ 数字和 $Q$ 数字都不是质数。请按照顺序输出所有的神奇的数字对。 ## 输入格式 一行两个整数 $M$ 和 $N$ ,用空格隔开. ## 输出格式 多行数据。每一行输出一个满足条件的$P$数字和对应的 $Q$ 数字。不存在这样的数字对输出$-1$。 ## 样例 #1 ### 样例输入 #1 ``` 3 60 ``` ### 样例输出 #1 ``` 12 15 15 12 ``` ## 提示 对于 $30\%$ 的数据,$ 2<=N$ , $M<=10^3 $。 对于 $50\%$ 的数据, $ 2<=N$ , $M<=5*10^4 $。 对于 $100\%$ 的数据, $2<=N$, $M<=10^7$。c++代码
时间: 2023-09-08 14:07:54 浏览: 93
数字信号处理课程设计指南
对于这道题目,我们可以通过枚举的方式来找到满足条件的数字对。首先,我们可以从2开始遍历到$\sqrt{N}$,对于每一个数$i$,我们判断是否是$N$的因子,如果是的话,我们可以计算出$P$数字和$Q$数字分别为$i$和$\frac{N}{i}$。接下来我们需要验证这个数字对是否满足最大公约数为$M$。如果满足条件,我们输出这个数字对。具体的代码如下:
```c++
#include <iostream>
#include <cmath>
using namespace std;
int gcd(int a, int b) {
if(b == 0) return a;
return gcd(b, a % b);
}
int main() {
int M, N;
cin >> M >> N;
bool exist = false;
for(int i = 2; i <= sqrt(N); i++) {
if(N % i == 0) {
int p = i;
int q = N / i;
if(gcd(p, q) == M && p != 1 && q != 1) {
cout << p << " " << q << endl;
cout << q << " " << p << endl;
exist = true;
}
}
}
if(!exist) {
cout << -1 << endl;
}
return 0;
}
```
希望可以帮助到你!如果有任何问题,请随时提出。
阅读全文