题目来源:
https://www.luogu.org/problemnew/show/P4752
题目描述:
题目描述
给定一个数字 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
解题思路:
这题乍一眼一看,我还以为是巨难的数论题,后来看到了题目的最后的一句话才知道,原来分母和分子是一定可以约分,且约分完之后,分母一定为1,分子可能为1,有可能不唯一,那么我们可以用map对各个因子记录出现次数,当输入分子的时候,map++;当输入分母的时候map--;当一个因子为次数为0的时候,就删除这一项,最后,如果map.size()>2说明因子一定大于两个,所以不是质数,当size为1的时候,如果这个数出现次数大于1时或者这个数本身就不是质数,那么也答案也不是质数,否则就是质数。
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
map<long long,int>m;
map<long long,int>::iterator it;
bool pd(long long x)
{
for(long long i=2;i<=sqrt(x);i++)
if(x%i==0)return 0;
return 1;
}
int main()
{
int t;
cin>>t;
while(t--)
{
m.clear();
int n,k;
cin>>n>>k;
long long a;
for(int i=1;i<=n;i++)
{
cin>>a;
if(a==1)continue;
m[a]++;
}
for(int i=1;i<=k;i++)
{
cin>>a;
if(a==1)continue;
m[a]--;
if(m[a]==0){
m.erase(a);
}
}
if(m.size()!=1)cout<<"NO"<<endl;
else{
long long zhi=m.begin()->first;
int sum=m.begin()->second;
if(sum!=1||!pd(zhi)){
cout<<"NO"<<endl;
}
else cout<<"YES"<<endl;
}
}
return 0;
}