• 小w的a=b问题


    题意

    题目链接:https://ac.nowcoder.com/acm/contest/7023/A

    分析

    解法1-哈希

    可以利用哈希映射,但是可以要选择合适的模数,一开始选择的是 (1e9+7),不行,换成 (1e9+9) 才可以,或者 (2147483587)

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    const int mod=1e9+9;//选择合适的模数1e9+7不行
    ll fac[N];
    void init()
    {
        int maxn=1e5;
        fac[0]=1;
        for(int i=1;i<=maxn;i++)
            fac[i]=fac[i-1]*i%mod;
    }
    int main()
    {
        int T,n,m,a;
        init();
        scanf("%d",&T);
        while(T--)
        {
            ll x=1,y=1;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&a);
                x=x*fac[a]%mod;
            }
            for(int i=1;i<=m;i++)
            {
                scanf("%d",&a);
                y=y*fac[a]%mod;
            }
            if(x==y) printf("equal
    ");
            else printf("unequal
    ");
        }
        return 0;
    }
    
    

    解法2-质因子分解

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long ll;
    const int N=1e5+10;
    int prime[1010],cnt;
    bool vis[1010];
    int a[N],b[N],ma[N],mb[N];
    void init()
    {
        int maxn=1e3;
        for(int i=2;i<=maxn;i++)
        {
            if(!vis[i]) prime[++cnt]=i;
            for(int j=1;prime[j]*i<=maxn;j++)
            {
                vis[i*prime[j]]=1;
                if(i%prime[j]==0) break;
            }
        }
    }
    int main()
    {
        int T,n,m,x;
        init();
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            int maxn=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d",&x);
                a[x]++;
                maxn=max(maxn,x);
            }
            for(int i=1;i<=m;i++)
            {
                scanf("%d",&x);
                b[x]++;
                maxn=max(maxn,x);
            }
            for(int i=maxn;i>=2;i--)//计最终的乘积中每个数出现的次数,从后向前
                a[i-1]+=a[i],b[i-1]+=b[i];
            for(int i=2;i<=maxn;i++)
            {
                int t=i;
                for(int j=1;prime[j]*prime[j]<=t&&j<=cnt;j++)//质因子分解
                {
                    while(t%prime[j]==0)
                    {
                        t/=prime[j];
                        ma[prime[j]]+=a[i];
                        mb[prime[j]]+=b[i];
                    }
                }
                if(t>1) ma[t]+=a[i],mb[t]+=b[i];
            }
            bool f=1;
            for(int i=1;i<=1e5;i++)
            {
                if(ma[i]!=mb[i])
                    f=0;
                ma[i]=0,mb[i]=0;
                a[i]=0,b[i]=0;
            }
            if(f) printf("equal
    ");
            else printf("unequal
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    SaveFileDialog控件
    OpenFileDialog组件打开文件....待续
    零碎笔记集合......
    Environment 类
    StatusStrip状态栏控件
    NotifyIcon制作任务栏托盘菜单
    ContextMenuStrip控件
    object sender ,EventArs e
    MenuItem
    TabControl控件
  • 原文地址:https://www.cnblogs.com/1024-xzx/p/13505488.html
Copyright © 2020-2023  润新知