思路:可以统计一下a数组和b数组的质因子个数,如果有一个质因子的个数不相等即为unequal,如何统计质因子个数呢?如果枚举数组再分解的话特定tle,这里可以先预处理所有的质数,然后统计一下每个质数作为质因子的贡献即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+1;
int top=0,isprime[maxn]={0},prime[maxn]={0},a[maxn],b[maxn],num1[maxn],num2[maxn];
void Prime(int n)
{
for(int i=2;i<=n;++i)
{
if(!isprime[i]) prime[top++]=i;
for(int j=0;j<top;++j)
{
if(i*prime[j]>n) break;
isprime[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
int x,n,m,T,flag,maxx;
Prime(1000);
//for(int i=0;i<top;++i) cout<<prime[j]<<endl;
scanf("%d",&T);
while(T--)
{
for(int i=0;i<=maxn;++i) a[i]=b[i]=num1[i]=num2[i]=0;//清零
flag=maxx=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) {
scanf("%d",&x);
a[x]++;
maxx=max(maxx,x);
}
for(int i=1;i<=m;++i){
scanf("%d",&x);
b[x]++;
maxx=max(maxx,x);
}
for(int i=maxx;i>=1;--i)
a[i-1]+=a[i],b[i-1]+=b[i];
for(int i=2;i<=maxx;++i)
{
int t=i;
for(int j=0;prime[j]*prime[j]<=t;++j)
{
while(t>1&&t%prime[j]==0)
{
t/=prime[j];
num1[prime[j]]+=a[i];
num2[prime[j]]+=b[i];
}
}
if(t>1) num1[t]+=a[i],num2[t]+=b[i];
}
for(int i=2;i<maxn;++i)
if(num1[i]!=num2[i]){
flag=1;break;
}
printf("%s\n",flag?"unequal":"equal");
}
}