优快云英雄会---最小公倍数

题目详情

给定正整数序列x1,x2,…xn,和一个正整数m,问是否可以找到一个子序列,使得子序列的最小公倍数恰好等于m?

输入格式:

多组数据,每组数据第一行是2个正整数n,m。0<n<=10000, 0<m<=1000000000。

接下来一行包含n个空白分隔的正整数,表示数列里的数,每个正整数小于1000000000。

输出格式:

每组数据一行,如果可以输出Possible,否则输出Impossible。



答题说明

输入样例

4 20

2 3 4 5

3 60

2 3 4

输出样例:

Possible

Impossible



分析思路:

1:最简单的办法是求出所有正整数序列的最小公倍数,然后与输入的m值进行比较;

2:利用递归的办法进行解决:依次求出两个正整数的最小公倍数,比对此时的最小公倍数是否与输入的m值相同?

       1):相同则后面不再进行求最小公倍数,而是用此最小公倍数除以后面的正整数序列,一旦有余数不为0的情况发生,则说明此m不是最小公倍数;

       2):不同的话,则用此最小公倍数作为一个输入的正整数,再取后面的正整数序列中的一个值(依次取),求其最小公倍数,然后转入1);如果在2)中已经取到最后正整数序列中的最后一个整数,且此时计算的最小公倍数依旧和m不同,则认为此时m不是其正整数序列的最小公倍数;


依旧以上两种思路就可以完成此题目的要求,但是是否是最好的算法有待考证!

到此时则问题已经转为怎么求两个正整数的最小公倍数的问题?最小公倍数如何求呢?最小公倍数=两个数的乘积除以两个数的最大公约数,所以问题又转为如何求两个数的最大公约数问题;最大公约数的算法有两种,如下所示:

 一:辗转相除法

假设存在A和B两个正整数(且A>B),那么令R= A % B,R和B分别取代原来的B和A,重复取余工作,直到R=0(表明那个A就是最大公约数)。


二:辗转相减法

假设有两个数(A,B)且A大于B,令 D = A - B,将D和B再次按照大小代入A和B中,由大数减去小数……这样辗转相减,直到A=B,此时A或者B就是最大公约数。


至此要解决此问题的所有难点已经解决,然后就是编码的问题了。(编码后期补充)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值