本文已参与[新人创作礼]活动,一起开启掘金创作之路
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
这是3月26日代码源div2的每日一题。
知识点:数论
RSA - 题目 - Daimayuan Online Judge
RSA算法选择两个不同质数的积作为模数。现在有两个正整数 A,B,如果它们是不同的质数,则判定为 full credit;否则,如果A⋅B不是任意大于1的整数的平方的整数倍,则判定 partial credit;否则判定为no credit。
输入格式
一行两个正整数 A,B。
输出格式
full credit 或 partial credit 或 no credit。
样例1输入
13 23
样例1输出
full credit
问题分析
直接依照题意来写。
求a,b两个数的因子,如果这两个数的因子有相同的(该因子要大于1),那么就说明他们两个的乘积是某个大于1的整数的平方的倍数。
为什么呢?首先我们应该知道,两个数相乘,那他们的因子也当是相乘起来的,比如12*8,12的因子有3 4(2 6也可以),8的因子是2 4,8 *12就等于3 *4 *2 *4=96,然后我们在这里看到了什么,两个4相乘了,两个相同的因子相乘自然得到的就是这个因子的平方数了,这样其它的因子相乘就相当于我们的乘积(96)到平方数(16)的倍数(3 *2)。
所以我们要知道两个数相乘是不是某个平方数的倍数,不用真的把他们相乘然后枚举平方数来看这个平方数是不是他们的因子,而且在这里a和b最多能取到1e12,那他们相乘是1e24,相当于我们要枚举到1e12,想想就麻烦。所以我们直接分解a,b并看他们的因子是否有相同的即可:
如果有因子相等,那就输出no credit。
如果没有因子相等,就输出partial credit。
如果没有因子说明他俩是质数,我们再判断一下a和b是否相等:
不相等就输出full credit
相等就输出partial credit
但还有种特殊情况,就是a和b可能已经有一方是一个平方数了,所以我们一开始要先判断一下a和b有没有哪个是平方数,如果有就直接输出no credit即可。