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

探讨了如何判断一个整数序列是否存在子序列,其最小公倍数等于给定值m的方法。通过求序列的最小公倍数并与m比较,采用递归方式逐对检查整数,最终确定可能解。

题目详情

给定正整数序列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就是最大公约数。


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



1-n的最小公倍数可以使用辗转相除法和穷举法两种方法。 使用辗转相除法的步骤如下: 1. 初始化最小公倍数1。 2. 从2开始遍历到n,对每个数执行以下操作: a. 判断当前数与最小公倍数的最大公约数是否为1,如果是,则将最小公倍数乘以当前数。 b. 如果最大公约数不是1,则将最小公倍数除以最大公约数,再乘以当前数。 3. 返回最小公倍数的值。 使用穷举法的步骤如下: 1. 初始化最小公倍数为n。 2. 从n-1开始递减到1,对每个数执行以下操作: a. 如果当前数与最小公倍数取模不为0,将最小公倍数加上n。 3. 返回最小公倍数的值。 两种方法都能够正确求得1-n的最小公倍数,选择哪种方法主要取决于具体的情况和n的大小。 举个例子,如果我们要求1-10的最小公倍数,可以使用辗转相除法: 1. 初始化最小公倍数1。 2. 遍历2到10的每个数: a. 对于2,判断1和2的最大公约数是否为1,是的话,将最小公倍数乘以2,得到2。 b. 对于3,判断2和3的最大公约数是否为1,是的话,将最小公倍数乘以3,得到6。 c. 对于4,判断6和4的最大公约数是否为1,不是的话,将最小公倍数除以2,再乘以4,得到12。 d. 对于5,判断12和5的最大公约数是否为1,是的话,将最小公倍数乘以5,得到60。 e. 对于6,判断60和6的最大公约数是否为1,不是的话,将最小公倍数除以6,再乘以6,得到60。 f. 对于7、8、9、10,都与60的最大公约数为1,所以将最小公倍数分别乘以7、8、9、10,得到最终结果2520。 4. 返回最小公倍数2520。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [求1~n的最小公倍数(LCM)](https://blog.csdn.net/coldwind902/article/details/124548995)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [最大公约数最小公倍数n-s盒图](https://download.csdn.net/download/d52370/11026280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值