1 条题解
-
0
题解:判断两个数的乘积是否为素数
题目分析
给定两个整数 和 ,我们需要判断它们的乘积 是否为素数。
输入格式:
- 第一行是测试组数 ()
- 接下来 行,每行包含两个整数 和 ()
输出格式:
- 对于每组测试数据,如果 是素数,输出
YES,否则输出NO
数学原理
素数的定义
素数(质数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
关键数学性质
定理:如果 是一个素数,那么 和 中必须有一个等于1,另一个等于该素数。
证明: 假设 是一个素数,且 ,。
根据素数的定义,素数只有两个正因数:1和它本身。如果 且 ,那么:
- 是 的一个因数(因为 )
- 是 的一个因数(因为 )
- 而且 ,(因为 ,所以 )
- 同理 ,
这意味着 至少有四个不同的因数:1, , , ,这与素数的定义矛盾。因此,如果 是素数,那么 和 中必须有一个等于1。
推论
对于 是素数的必要条件:
- 且 是素数,或者
- 且 是素数
算法设计
基于上述数学原理,我们可以设计高效的算法:
- 如果 ,检查 是否为素数
- 如果 ,检查 是否为素数
- 其他情况直接返回
NO
素数检测算法
由于 和 最大可达 ,我们需要高效的素数检测算法。
使用试除法优化:
- 先判断特殊情况( 不是素数, 是素数)
- 排除所有偶数(除了2)
- 只需要检查到 的因数
- 以步长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
- 上传者