1915:【01NOIP普及组】最大公约数与最小公倍数
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3741 通过数: 1437
【题目描述】
二个正整数x0,y0(2≤x0≤100000,2≤y0≤1000000),求满足下列条件的P,Q的个数。
条件:
1.P,Q是正整数;
2.要求P,Q以x0为最大公约数,以y0为最小公倍数。
试求:满足条件的所有可能的两个正整数的个数。
【输入】
输入x0和y0
【输出】
满足条件的所有可能的两个正整数的个数
【输入样例】
3 60
【输出样例】
4
【提示】
样例说明:此时的P Q分别为:
3 60
15 12
12 15
60 3
#include <iostream>
#include <cstdio>
using namespace std;
int n, m, f[1000001], v[1000001], sum, x, y, ans;
inline int gy(int x, int y) { //寻找公因数
for (int i = min(x, y); i >= 2; --i)//--i比++i快(以下相同)
{
if (x % i == 0 && y % i == 0)
{
if (i == n) return 0;
break;
}
}
return 1;
}
int main() {
scanf("%d %d", &n, &m);
for (;;)//相当于while(1)
{
++sum;
f[sum] = n * sum;
if (f[sum] > m) { //存储是x0的倍数的数字
--sum;
break;
}
}
for (int i = 1; i <= sum; ++i)
{
for (int j = 1; j <= sum; ++j)
{
if (n * (f[i] / n) * (f[j] / n) == m && !gy(f[i], f[j])) {
++ans;
}
}
}
printf("%d\n", ans);
return 0;
}