首页 > 代码库 > CSDN 素因子集合

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;
}


CSDN 素因子集合