您的位置:首页 > 理论基础 > 计算机网络

CSU 1871 中南大学网络赛E题 简单的数论

2017-04-15 21:34 363 查看
题目:


Description

擅长数学的小A君不满足于简单的求解最大公约数和最小公倍数的问题了,他研究出了一个新的题型准备去考考小B,小A给小B 4个正整数a,b,c,d,他问小B能否找到一个数x,使得a和x的最大公约数为b,c和x的最小公倍数为d。如果有多个这样的x,将所有的x按由小到大的顺序列出来,如果找不到任何一个这样的x,那么就输出-1。


Input

第一行给定一个正整数T,表示有T组数据 (T<=100) 接下来T行每行输入4个正整数a,b,c,d (这四个数都小于2^31)


Output

对于每组数据按照从小到大的顺序输出所有的x的值,如果一个x都找不到则输出-1。


Sample Input

1
6 3 5 15



Sample Output

3 15


代码:

#include<iostream>
using namespace std;

int gcd(int a, int b)
{
if (b)return gcd(b, a%b);
return a;
}

void f2(int a, int b, int c, int d)
{
if (a%b!=0 || d%c!=0 || d%b!=0)
{
cout << -1;
return;
}
int g = gcd(a / b, d / c), p = d / b;
if (gcd(g,p)>1)
{
cout << -1;
return;
}
a /= b, d /= c;
while (gcd(a, p) > 1)p /= gcd(a, p);
while (gcd(d, p) > 1)b *= gcd(d, p), p /= gcd(d, p);
int i;
for (i = 1; i*i <= p; i++)if (p%i == 0)cout << i*b << " ";
for (; i > 0; i--)if (p%i == 0 && i*i<p)cout << p / i*b << " ";
}

int main()
{
int t, a, b, c, d;
cin >> t;
while (t--)
{
cin >> a >> b >> c >> d;
f2(a, b, c, d);
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: