给定一个数字 A A A,这个 A A A由 a 1 , a 2 , ⋯ , a N a_1,a_2,\cdots,a_N a1,a2,⋯,aN相乘得到。
给定一个数字 B B B,这个 B B B由 b 1 , b 2 , ⋯ , b M b_1,b_2,\cdots,b_M b1,b2,⋯,bM相乘得到。
如果
A
B
\frac{A}{B}
BA是一个质数,请输出YES,否则输出NO。
每个测试点包含多组数据,第一行读入一个整数 T T T 表示数据组数,对于每组数据:
第一行输入两个整数 N , M N,M N,M,分别表示 A A A 由 N N N 个数字相乘得到, B B B 由 M M M 个数字相乘得到。
第二行输入 N N N 个整数,分别表示组成 A A A 的 N N N 个数字。
第三行输入 M M M 个整数,分别表示组成 B B B 的 M M M 个数字。
保证对于一个数字,其在 b i {b_i} bi 中出现的次数不多于在 a i {a_i} ai 中出现的次数。
对于每组数据:
如果
A
B
\frac{A}{B}
BA 是一个质数,请输出 YES,否则输出 NO。
在输出 YES 或 NO 后输出一个换行符。
2
3 2
5 7 7
5 7
4 2
5 7 7 7
5 7
YES
NO
1 ≤ N ≤ 100000 1 \le N \le 100000 1≤N≤100000
0 ≤ M ≤ N 0 \le M \le N 0≤M≤N
1 ≤ a i , b i ≤ 1 0 12 1 \le a_i,b_i \le 10^{12} 1≤ai,bi≤1012
1 ≤ T ≤ 10 1 \le T \le 10 1≤T≤10
∑ N ≤ 100000 \sum N \le 100000 ∑N≤100000
保证对于一个数字,其在bi中出现的次数不多于在ai中出现的次数。
根据这句话,我们不难得出:
因为a中乘积一定整除b中乘积,而如果m-n大于1,或者m==n时,剩下的乘积一定都不是质数;所以只需要看在a中多出来的数字就行啦。
怎么看在a中多出来的数字呢?
其实也不难,首先因为多出来的最多只有一个,所以我们可以在b末尾加一个-1000。
接着对两个数组分别排序,a中第一个与b不对应的那个数字就是多出来的数字。
最后判断其是否为素数即可!
注意
因为1对于乘积没有什么影响,所以我们要滤掉读入里面所有的1(当然也可以不过滤)
#include
using namespace std;
int n,m;
int a[1000000],b[1000000];
bool aa(int n)//判断质数
{
for(int i=2;i<=n/i;i++)
{
if(n%i==0)
{
return 0;
}
}
return 1;
}
int T;
int main()
{
cin>>T;
while(T--)
{
cin>>m>>n;
for(int i=1;i<=m;i++)
{
cin>>a[i];
if(a[i]==1)//过滤
{
i--;
m--;
}
}
for(int i=1;i<=n;i++)
{
cin>>b[i];
if(b[i]==1)
{
i--;
n--;
}
}
if(m-n==0||m-n>1)
{
cout<<"NO"<<endl;
continue;
}
sort(a+1,a+m+1);//排序
sort(b+1,b+n+1);
b[m]=-1000;//赋值
for(int i=1;i<=m;i++)
{
if(a[i]!=b[i])//多出来的那个数
{
if(aa(a[i])==1)//判断是质数还是合数
{
cout<<"YES"<<endl;
}
else
{
cout<<"NO"<<endl;
}
break;//退出循环
}
}
}
return 0;
}
结束啦~