1 条题解

  • 0
    @ 2025-10-13 19:55:40

    题解:判断两个数的乘积是否为素数

    题目分析

    给定两个整数 aabb,我们需要判断它们的乘积 a×ba \times b 是否为素数。

    输入格式

    • 第一行是测试组数 TT1T101 \leq T \leq 10
    • 接下来 TT 行,每行包含两个整数 aabb1a,b10111 \leq a, b \leq 10^{11}

    输出格式

    • 对于每组测试数据,如果 a×ba \times b 是素数,输出 YES,否则输出 NO

    数学原理

    素数的定义

    素数(质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

    关键数学性质

    定理:如果 p=a×bp = a \times b 是一个素数,那么 aabb 中必须有一个等于1,另一个等于该素数。

    证明: 假设 p=a×bp = a \times b 是一个素数,且 a>1a > 1b>1b > 1

    根据素数的定义,素数只有两个正因数:1和它本身。如果 a>1a > 1b>1b > 1,那么:

    • aapp 的一个因数(因为 p=a×bp = a \times b
    • bbpp 的一个因数(因为 p=a×bp = a \times b
    • 而且 a1a \neq 1apa \neq p(因为 b>1b > 1,所以 a<pa < p
    • 同理 b1b \neq 1bpb \neq p

    这意味着 pp 至少有四个不同的因数:1, aa, bb, pp,这与素数的定义矛盾。因此,如果 p=a×bp = a \times b 是素数,那么 aabb 中必须有一个等于1。

    推论

    对于 a×ba \times b 是素数的必要条件:

    1. a=1a = 1bb 是素数,或者
    2. b=1b = 1aa 是素数

    算法设计

    基于上述数学原理,我们可以设计高效的算法:

    1. 如果 a=1a = 1,检查 bb 是否为素数
    2. 如果 b=1b = 1,检查 aa 是否为素数
    3. 其他情况直接返回 NO

    素数检测算法

    由于 aabb 最大可达 101110^{11},我们需要高效的素数检测算法。

    使用试除法优化:

    • 先判断特殊情况(n1n \leq 1 不是素数,n=2n = 2 是素数)
    • 排除所有偶数(除了2)
    • 只需要检查到 n\sqrt{n} 的因数
    • 以步长2递增(只检查奇数因数)

    代码实现

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    
    bool isPrime(ll n) {
        if (n <= 1) return false;
        if (n == 2) return true;
        if (n % 2 == 0) return false;
        
        // 只需要检查到 sqrt(n)
        for (ll i = 3; i <= n / i; i += 2) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        cout.tie(nullptr);
        
        int t;
        cin >> t;
        while (t--) {
            ll a, b;
            cin >> a >> b;
            
            // 根据数学原理:a*b是素数当且仅当(a==1且b是素数)或(b==1且a是素数)
            if ((a == 1 && isPrime(b)) || (b == 1 && isPrime(a))) {
                cout << "YES" << endl;
            } else {
                cout << "NO" << endl;
            }
        }
        
        return 0;
    }
    
    • 1

    信息

    ID
    57
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    19
    已通过
    5
    上传者