P4752 Divided Prime

P4752 Divided Prime

题目描述
给定一个数字 AA ,这个 AA 由 a_1,a_2,cdots,a_Na
1
​ ,a
2
​ ,⋯,a
N
​ 相乘得到。

给定一个数字 BB ,这个 BB 由 b_1,b_2,cdots,b_Mb
1
​ ,b
2
​ ,⋯,b
M
​ 相乘得到。

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

输入输出格式
输入格式:
每个测试点包含多组数据,第一行读入一个整数 TT 表示数据组数,对于每组数据:

第一行输入两个整数 N,MN,M ,分别表示 AA 由 NN 个数字相乘得到, BB 由 MM 个数字相乘得到。

第二行输入 NN 个整数,分别表示组成 AA 的 NN 个数字。

第三行输入 MM 个整数,分别表示组成 BB 的 MM 个数字。

保证对于一个数字,其在 {b_i}b
i
​ 中出现的次数不多于在 {a_i}a
i
​ 中出现的次数。

输出格式:
对于每组数据:

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

在输出YES或NO后输出一个换行符。


模拟 + 数学

首先读题可知,分母(B)的因子分子(A)都有,所以我们把因子排序,双指针模拟约分的过程。

一个约分后的分数为质数,当且约分后分子剩余一个质数

所以我们约分,当分子有合数不能约分是,则不是质数,或者当分子有两个以上质数无法约分是则不是质数

注意(1)不是质数,还有分子分母约数的(1)要跳过

Code

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#include<cmath>
typedef long long LL;
using namespace std;
LL RD(){
    LL out = 0,flag = 1;char c = getchar();
    while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
    while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
    return flag * out;
    }
const LL maxn = 1000019;
LL T, na, nb;
LL a[maxn], b[maxn];
bool isprime(LL x){
    LL R = sqrt(x * 1.0);
    for(LL i = 2;i <= R;i++){
        if(x % i == 0)return 0;
        }
    return 1;
    }
int main(){
    T = RD();
    while(T--){
        memset(a, 0, sizeof(a));
        memset(b, 0, sizeof(b));
        na = RD();nb = RD();
        for(LL i = 1;i <= na;i++)a[i] = RD();
        for(LL i = 1;i <= nb;i++)b[i] = RD();
        sort(a + 1, a + 1 + na);sort(b + 1, b + 1 + nb);
        LL p1 = 1, p2 = 1, tot = 0, mem = -1;
        bool flag = 1;
        while(a[p1] == 1)p1++;while(b[p2] == 1)p2++;
        while(p1 <= na){
            if(a[p1] == b[p2])p1++, p2++;
            else{
                mem = a[p1];
                if(!isprime(mem)){
                    printf("NO
");
                    flag = 0;
                    break;
                    }
                tot++;
                if(tot == 2){
                    printf("NO
");
                    flag = 0;
                    break;
                    }
                p1++;
                }
            }
        if(mem == -1){
            printf("NO
");
            continue;
            }
        if(flag)
        printf("YES
");
        }
    return 0;
    }
原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9311422.html