CSU 1871 中南大学网络赛E题 简单的数论
2017-04-15 21:34
363 查看
题目:
擅长数学的小A君不满足于简单的求解最大公约数和最小公倍数的问题了,他研究出了一个新的题型准备去考考小B,小A给小B 4个正整数a,b,c,d,他问小B能否找到一个数x,使得a和x的最大公约数为b,c和x的最小公倍数为d。如果有多个这样的x,将所有的x按由小到大的顺序列出来,如果找不到任何一个这样的x,那么就输出-1。
第一行给定一个正整数T,表示有T组数据 (T<=100) 接下来T行每行输入4个正整数a,b,c,d (这四个数都小于2^31)
对于每组数据按照从小到大的顺序输出所有的x的值,如果一个x都找不到则输出-1。
代码:
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; }
相关文章推荐
- 2017年暑假组队训练赛-No.7 K - 简单的数论 CSU - 1871
- CSU 1866 中南大学网络赛A题 Apache and new sports competition
- CSU 1867 中南大学网络赛F题 John and Health rate
- CSU 1869 中南大学网络赛C题 树上最大值
- 【模板】 简单数论
- CSU_BMW正式组队纪念赛将于3月4日(周日)在中南大学OJ举行
- 一个简单的数论问题
- (A^B)%C 快速幂乘 (简单数论)
- HDU 2991 || SDUT 2394 Generate random numbers(简单数论)
- HDOJ 1163 Eddy's digital Roots [简单数论]
- poj 2992 Divisors 简单的数论问题
- HDU 1576 A/B(数论简单题,求逆元)
- HDU 4335 What is N? 简单数论
- HDU 3818 A + B Problem 简单数论题
- hdu 2421简单数论题
- HDU 3826 Squarefree number 简单的数论题
- POJ 3090简单数论
- poj 1365 Prime Land 【简单数论】
- HDU 1492 The number of divisors(约数) about Humble Numbers(数论,简单约数)
- HDU-4145 A Simple Problem 简单数论