小w的a=b問題
阿新 • • 發佈:2020-08-14
題意
題目連結: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\n"); else printf("unequal\n"); } 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\n"); else printf("unequal\n"); } return 0; }