素因子集合
题目详情:
小强最近在学初等数论,老师给他们出了一个课后习题,那就是给你两个正整数A,B(0<A,B<2^60),判断他们的素因子集合是否相同,小强刚接触数论,想了好一会还是没能想出来,你能帮助他吗?
输入描述:
输入包含多组测试数据,每组测试数据包含两个正整数A,B,以文件结束。
输出描述:
对于每组测试数据如果A和B的素因子集合相同则输出“YES”,否则输出“NO”。
答题说明:
输入样例:
2 8
4 9
10 50
输出样例:
YES
NO
YES
AC码:
#include<stdio.h>
#include<string.h>
long long num1[200000],num2[200000];
long long Euler(long long n,long long num[])
{
long long i,k=0;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
num[k++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)
{
num[k++]=n;
}
return k;
}
int main()
{
long long a,b,x,y,i;
while(~scanf("%lld%lld",&a,&b))
{
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
x=Euler(a,num1);
y=Euler(b,num2);
if(x==y)
{
for(i=0;i<x;i++)
{
if(num1[i]!=num2[i])
break;
}
if(i>=x)
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
return 0;
}
AC码:
#include<stdio.h>
#include<string.h>
__int64 num1[200000],num2[200000];
__int64 Euler( __int64 n, __int64 num[200000])
{
int i,k=0;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
num[k++]=i;
while(n%i==0)
n/=i;
}
}
if(n>1)
{
num[k++]=n;
}
return k;
}
int main()
{
__int64 a,b,x,y,i;
while(~scanf("%I64d %I64d",&a,&b))
{
memset(num1,0,sizeof(num1));
memset(num2,0,sizeof(num2));
x=Euler(a,num1);
y=Euler(b,num2);
if(x==y)
{
for(i=0;i<x;i++)
{
if(num1[i]!=num2[i])
break;
}
if(i>=x)
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
return 0;
}