CSDN 素因子集合

题目详情:

http://student.csdn.net/mcs/programming_challenges?page=4

小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数A,B(0<A,B<2^60),判断他们的素因子集合是否相同,小强刚接触数论,想了好一会还是没能想出来,你能帮助他吗?

输入描述:

输入包含多组测试数据,每组测试数据包含两个正整数A,B,以文件结束。

输出描述:

对于每组测试数据如果A和B的素因子集合相同则输出“YES”,否则输出“NO”。

输入样例:

2 8

4 9

10 50

输出样例:

YES

NO

YES

题目分析:

/**

*任意整数都可以表示成几个素数的幂次的乘积

*n=a1^p1+a2^p2A+...+ai^pi 其中ai为素数,pi为其指数

*可以利用此性质解题,求没每一个数的素因子集合,

*比较两个素因子集合是否相同.

*起初一直用^异或操作的下列性质a^0=a a^a=0

*一值wa,这是个陷阱,注意s=2^5^7=0;

*2=010 5=101 7=111

*因此此题可以用数组存下集合,进行逐个比较,也可以用乘积比较

*这里用乘积进行比较,有的读者可能会疑虑,乘积不会出错吗?请读者注意

*这里的因子全是素数,不会出现意外。

*/

AC代码:

/**
 *任意整数都可以表示成几个素数的幂次的乘积
 *n=a1^p1+a2^p2A+...+ai^pi 其中ai为素数,pi为其指数
 *可以利用此性质解题,求没每一个数的素因子集合,
 *比较两个素因子集合是否相同.
 *起初一直用^异或操作的下列性质a^0=a a^a=0
 *一值wa,这是个陷阱,注意s=2^5^7=0;
 *2=010 5=101 7=111
 *因此此题可以用数组存下集合,进行逐个比较,也可以用乘积比较
 *这里用乘积进行比较,有的读者可能会疑虑,乘积不会出错吗?请读者注意
 *这里的因子全是素数,不会出现意外。
 */
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
    long long a,b;
    while(scanf("%lld%lld",&a,&b)!=EOF){
        if(a==1&&b==1){printf("NO\n"); continue;}
        long long s1=1,s2=1;
        for(long long i=2;i*i<=a;i++){
            if(a%i==0){
                s1=s1*i;//一个数只进行一次异或
                //cout<<i<<endl;
                while(a%i==0){
                    a/=i;
                }
            }
        }
        if(a>1) s1=s1*a;
        for(long long i=2;i*i<=b;i++){
            if(b%i==0){
                s2=s2*i;
                //cout<<i<<endl;
                while(b%i==0){
                    b/=i;
                }
            }
        }
        if(b>1) s2=s2*b;
        if(s1==s2) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
时间: 2025-02-01 12:46:26

CSDN 素因子集合的相关文章

庞果网之素因子集合

[题目] 题目详情 小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数A,B(0<A,B<2^60),判断他们的素因子集合是否相同,小强刚接触数论,想了好一会还是没能想出来,你能帮助他吗? 输入描述: 输入包含多组测试数据,每组测试数据包含两个正整数A,B,以文件结束. 输出描述: 对于每组测试数据如果A和B的素因子集合相同则输出"YES",否则输出"NO". 答题说明 输入样例: 2 8 4 9 10 50 输出样例: YES NO

python 素因子分解

在使用python解决问题之前,我们先说一下,什么是素因子分解 所谓素因子分解就是,先找这个数的所有约数(约数即:a%b == 0,也就是a可以被b整除) 例如:20的约数集合为 [1, 2, 5, 10, 20] 那么素因子分解呢? 就是从最小的素数约数开始除,也就是这个除数要满足两个条件,一是约数,二是素数 那么这里20的最小的素约数是2,所以我们从2开始除,并且一直除到不能被整出为止: num = 20 num = num / 2 num = 10(这里num依旧可以被2整除,所以再来一次

noj 2069 赵信的往事 [yy题 无限gcd]

njczy2010 2069 Accepted 31MS   224K 1351Byte G++ 2014-11-13 13:32:56.0 坑爹的无限gcd,,,尼玛想好久,原来要x对y算一次,y再对x算一次,,, 赵信的往事 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte总提交 : 20            测试通过 : 2 描述 赵信——德玛西亚的总管,可谓一人之下,万人之上.但谁能想到,他以前在诺克萨斯的角斗

开源蜘蛛集合(转自haizhiguang博客,链接:http://blog.csdn.net/haizhiguang/article/details/20209573)

各种蜘蛛: Heritrix   点击次数:1458 Heritrix是一个开源,可扩展的web爬虫项目.Heritrix设计成严格按照robots.txt文件的排除指示和META robots标签.  WebSPHINX   点击次数:777 WebSPHINX是一个Java类包和Web爬虫的交互式开发环境.Web爬虫(也叫作机器人或蜘蛛)是可以自动浏览与处理Web页面的程序.WebSPHINX由两部分组成:爬虫工作平台和WebSPHINX类包.  J-Spider   点击次数:1008 J

Java面试题目集合

有链接的都是引用别人的知识点. 1.equals方法用于比较对象的内容是否相等(覆盖以后) 2.hashcode方法只有在集合中用到 3.当覆盖了equals方法时,比较对象是否相等将通过覆盖后的equals方法进行比较(判断对象的内容是否相等). 4.将对象放入到集合中时,首先判断要放入对象的hashcode值与集合中的任意一个元素的hashcode值是否相等, 如果不相等直接将该对象放入集合中.如果hashcode值相等,然后再通过equals方法判断要放入对象与集合中的 任意一个对象是否相

Java集合

JAVA集合小结   有序否 允许元素重复否 Collection 否 是 List 是 是 Set AbstractSet 否 否 HashSet TreeSet 是(用二叉树排序) Map AbstractMap 否 使用key-value来映射和存储数据,Key必须惟一,value可以重复 HashMap TreeMap 是(用二叉树排序) 几个面试常见问题:1.Q:ArrayList和Vector有什么区别?HashMap和HashTable有什么区别?   A:Vector和HashT

使用Linq求和方法Sum计算集合中多个元素和时应该注意的性能问题

提出问题 本文使用下面的实例来说明问题,以下是实例的完整代码. //************************************************************ // // Sum应用示例代码 // // Author:三五月儿 // // Date:2014/09/10 // // http://blog.csdn.net/yl2isoft // //**********************************************************

【Java集合源码剖析】HashMap源码剖析

转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 HashMap简介 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap. HashMap 实现了Serializable接口,因此它支持序列化,

redis源码学习_整数集合

redis里面的整数集合保存的都是整数,有int_16.int_32和int_64这3种类型,和C++中的set容器差不多. 同时具备如下特点: 1.set里面的数不重复,均为唯一. 2.set里面的数是从小到大有序的,这在后面的intsetAdd函数中可以看到. 然后由于我们可以同时存储int_16.int_32和int_64这3种类型,一开始只能为一种类型.假设为int_32,那么我们要插入一个int_16类型的数,只需要找到位置直接插入就可以了:但是我们要插入一个int_64类型的数,我们