- 题目内容:
1.基本要求:求N个数的最大公约数和最小公倍数。用C或C++或java或python语言实现程序解决问题。
2.提高要求:已知正整数a0,a1,b0,b1,设某未知正整数x满足:
1、 x和a0的最大公约数是a1;
2、 x和b0的最小公倍数是b1。
Hankson的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的x并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x的个数。请你帮助他编程求解这个问题。
输入格式
输入第一行为一个正整数n,表示有n组输入数据。接下来的n行每行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。输入数据保证a0能被a1整除,b1能被b0整除。
输出格式
输出共n行。每组输入数据的输出结果占一行,为一个整数。
对于每组数据:若不存在这样的x,请输出0;
若存在这样的x,请输出满足条件的x的个数;
样例输入
2
41 1 96 288
95 1 37 1776
样例输出
6
2
数据范围与约定
对于 50%的数据,保证有1≤a0,a1,b0,b1≤10000 且n≤100。
对于 100%的数据,保证有1≤a0,a1,b0,b1≤2,000,000,000 且n≤2000。
样例解释
第一组输入数据, x x 可以是 9,18,36,72,144,2889,18,36,72,144,288 ,共有 66 个。
第二组输入数据, xx 可以是 48,177648,1776 ,共有 22 个。
二.算法设计
1.基本要求
1)输入所求的N个数
2)先求出两个数的最大公因数和最小公倍数
3)求已求得的最大公因数和最小公倍数和下一个数的最大公因数和最小公倍数
4)重复3)至所有数都参与计算了。
2.提高要求
1)输入n和每组数的数据a0,a1,b0,b1。
2)枚举统计合适的解
程序设计流程图:
基本要求
提高要求
三.调试
四.测试
测试用例
|
序号 |
测试模块 |
输入 |
预期输出 |
结果 |
|
1 |
int gcd() |
a=1,b=95 |
return 95 |
95 |
|
2 |
int lcm() |
a=1,b=95 |
return95 |
95 |
|
3 |
void solve() |
x=1 |
cout=0 |
0 |
五.心得总结
1.程序流程图for循环 while循环画法
2.学到了一种时间复杂度比较低的算法。
求出n的所有约数(筛素数,然后对素数试除求出质因数,dfs出约数),然后判断是否满足条件。