优快云 素因子集合

题目详情:

http://student.youkuaiyun.com/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;
}


Java集合类中的HashSet是一种基于哈希表实现的集合,它继承自AbstractSet类并实现了Set接口。HashSet类提供了高效的查找、插入和删除操作,可以存储不重复的元素。HashSet类的构造方法有四种形式:HashSet()、HashSet(int initialCapacity)、HashSet(int initialCapacity, float loadFactor)和HashSet(Collection<? extends E> c)。 你可以使用以下代码来创建一个HashSet集合: 1. 使用无参构造方法: HashSet<Integer> set = new HashSet<>(); 2. 使用指定初始容量的构造方法: HashSet<Integer> set1 = new HashSet<>(20); 3. 使用指定初始容量和负载因子的构造方法: HashSet<Integer> set2 = new HashSet<Integer>(20, 0.8f); 4. 使用指定集合的构造方法: HashSet<Integer> set3 = new HashSet<>(new ArrayList<Integer>()); 使用HashSet集合时,需要注意元素的唯一性和哈希值的计算,HashSet类内部使用哈希函数来计算元素的哈希值,并根据哈希值来存储和查找元素。当两个元素的哈希值相同时,HashSet会通过equals()方法来判断它们是否相等。在使用HashSet时,建议重写equals()和hashCode()方法,以确保元素的唯一性和正确的哈希值计算。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java中的集合类:HashSet](https://blog.csdn.net/friend_X/article/details/113755564)[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: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值