链接:https://ac.nowcoder.com/acm/contest/923/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
给你两个数组,一个a[]a[]数组,长度为n,另一个是b[]b[]数组,长度为m。
现在问你∏ni=1a[i]!∏i=1na[i]!是否等于∏mi=1b[i]!∏i=1mb[i]!
其中∏∏是连乘符,它表示n个元素的乘积。"!"为阶乘运算,表示小于等于该数所有正整数的积,并且规定0!=1。
我们认为阶乘运算"!"的优先级大于连乘运算"∏∏"。
输入描述:
第一行是一个正整数T,(1⩽T⩽2∗102)(1⩽T⩽2∗102)表示案例的数目 对于每组案例,第一行是两个正整数n,m,(1⩽n,m⩽105)(1⩽n,m⩽105)。 接下来一行输入n个整数a[i],(0⩽a[i]⩽105)(0⩽a[i]⩽105)。
接下来一行输入m个整数b[i],(0⩽b[i]⩽105)(0⩽b[i]⩽105)。
保证n,m的总和不多于2∗1062∗106
输出描述:
对于每组案例,输出一行一个字符串,如果∏ni=1a[i]!∏i=1na[i]!等于∏mi=1b[i]!∏i=1mb[i]!,请输出"equal"。 反之请输出"unequal"。
示例1
输入
复制
3 2 1 5 3 6 4 6 4 2 3 0 2 3 2 2 1 3 3 4 5 6 7 3 4 5 6
输出
复制
equal equal unequal
说明
对于第一组案例: 5!*3!=1*2*3*4*5*1*2*3=720 6!=1*2*3*4*5*6=720 完全相等。 对于第二组案例: 4!*2!*3!*0!=1*2*3*4*1*2*1*2*3*1=288 2!*3!*2!*2!*1!*3!=1*2*1*2*3*1*2*1*2*1*1*2*3=288 完全相等。 对于第三组案例: 5!*6!*7!=435456000 3!*4!*5!*6!=12441600 两者不等。
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define per(i,a,b) for(int i=a;i>=(b);--i)
#define in(x) scanf("%d",&x)
#define ind(x) scanf("%lld",&x)
#define out(x) printf("%d ",x);
#define outln(x) printf("%lld\n",x);
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
#define PE(x,y) x=((x)+(y))%mod
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
ll powmod(ll a,ll b) {ll res=1;a%=mod;
for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
const int N=1e5+10;
int a[N],b[N],c[N],d[N],p[N];
int t,n,m;
vector<ll>prime;
struct node
{
int x,y;
}pre[N];
void get_p()
{
int h=0;
for(int i=2;i<N;i++)
{
if(p[i]==0)
{
prime.pb(i);
}
for(int j=0;j<prime.size()&&i*prime[j]<N;j++)
{
pre[i*prime[j]].x=i;
pre[i*prime[j]].y=prime[j];
p[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main()
{
get_p();
in(t);
while(t--){
int mx=0;
rep(i,0,N-1) c[i]=d[i]=0;
in(n),in(m);
rep(i,1,n) {
in(a[i]);
mx=max(mx,a[i]);
++c[a[i]];
}
rep(i,1,m) {
in(b[i]);
mx=max(mx,b[i]);
++d[b[i]];
}
per(i,mx,1) {
c[i]+=c[i+1];
d[i]+=d[i+1];
}
per(i,mx,1) {
if(p[i]){
c[pre[i].x]+=c[i];
c[pre[i].y]+=c[i];
c[i]=0;
d[pre[i].x]+=d[i];
d[pre[i].y]+=d[i];
d[i]=0;
}
}
// rep(i,1,mx) {
// out(c[i]);
// }
// puts("");
// rep(i,1,mx)out(d[i]);
// puts("");
bool flag=1;
rep(i,2,mx){
if(c[i]!=d[i]) {
flag=0;
break;
}
}
if(flag) printf("equal\n");
else printf("unequal\n");
}
}