题目描述
给定一个数字 AA ,这个 AA 由 a_1,a_2,\cdots,a_Na1,a2,⋯,aN 相乘得到。
给定一个数字 BB ,这个 BB 由 b_1,b_2,\cdots,b_Mb1,b2,⋯,bM 相乘得到。
如果 \frac{A}{B}BA 是一个质数,请输出YES
,否则输出NO
。
输入输出格式
输入格式:
每个测试点包含多组数据,第一行读入一个整数 TT 表示数据组数,对于每组数据:
第一行输入两个整数 N,MN,M ,分别表示 AA 由 NN 个数字相乘得到, BB 由 MM 个数字相乘得到。
第二行输入 NN 个整数,分别表示组成 AA 的 NN 个数字。
第三行输入 MM 个整数,分别表示组成 BB 的 MM 个数字。
保证对于一个数字,其在 {b_i}bi 中出现的次数不多于在 {a_i}ai 中出现的次数。
输出格式:
对于每组数据:
如果 \frac{A}{B}BA 是一个质数,请输出
YES
,否则输出NO
。在输出
YES
或NO
后输出一个换行符。
输入输出样例
输入样例#1: 复制
2 3 2 5 7 7 5 7 4 2 5 7 7 7 5 7
输出样例#1: 复制
YES NO
说明
1 \le N \le 1000001≤N≤100000
0 \le M \le N0≤M≤N
1 \le a_i,b_i \le 10^{12}1≤ai,bi≤1012
1 \le T \le 101≤T≤10
\sum N \le 100000∑N≤100000
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 100000 + 10;
long long a[MAXN] , b[MAXN];
int main()
{
int T;
cin >> T;
while(T --)
{
int u , v ;
scanf("%d %d" , &u , &v);
for(int i = 1; i <= u ; i ++)
scanf("%d" , &a[i]);
for(int j = 1; j <= v ; j ++)
scanf("%d" , &b[j]);
sort(a + 1 , a + u + 1);
sort(b + 1 , b + v + 1);
int t1 , t2;
for(int i = 1 ; i <= u ; i ++)
{
if(a[i] != 1)
{
t1 = i;
break;
}
//t1 = i;
}
for(int i = 1 ; i <= v ; i ++)
{
if(b[i] != 1)
{
t2 = i;
break;
}
//t2 = i;
}
int num1 = u - t1 + 1;
int num2 = v - t2 + 1;
//cout << u << " " << v << " " << t1 << " " << t2 << " " << num1 << " " << num2 <<endl;
if(num1 - num2 >= 2)
{
printf("NO\n");
}
else if(num1 - num2 == 1)
{
long long temp = -1;
for(int i = t1 , j = t2 ; i <= u && j <= v ; i ++ , j ++)
{
if(a[i] != b[j])
{
temp = a[i];
//cout << "!! " << i << endl;
break;
}
}
if(temp == -1)
temp = a[u];
//cout << "!" << " " << temp << endl;
int flag = 1;
for(int i = 2 ; i * i <= temp ; i ++)
{
if(temp % i == 0)
{
flag = 0;
break;
}
}
if(flag)
{
printf("YES\n");
}
else
printf("NO\n");
}
else
printf("NO\n");
}
return 0;
}