P4752 Divided Prime

题目描述

给定一个数字 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

在输出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

#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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值