洛谷P4752 Divided Prime(简单模拟) 题解

题目来源:

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​ 中出现的次数。

扫描二维码关注公众号,回复: 2217853 查看本文章

输出格式:

对于每组数据:

如果 \frac{A}{B}BA​ 是一个质数,请输出YES,否则输出NO

在输出YESNO后输出一个换行符。

输入输出样例

输入样例#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;
}

代码:

猜你喜欢

转载自blog.csdn.net/qq_40400202/article/details/81085070