牛客练习赛48 B 小w的a=b问题(质因子分解)

在这里插入图片描述
在这里插入图片描述
思路:可以统计一下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");
    }
}
发布了70 篇原创文章 · 获赞 0 · 访问量 2449

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104138090