CSP-J 2022 解密:RSA 算法解密问题
[CSP-J 2022] 解密
题目描述
给定一个正整数 k,有 k 次询问,每次给定三个正整数 ni, ei, di,求两个正整数 pi, qi,使 ni = pi × qi、ei × di = (pi - 1)(qi - 1) + 1。
输入格式
第一行一个正整数 k,表示有 k 次询问。
接下来 k 行,第 i 行三个正整数 ni, di, ei。
输出格式
输出 k 行,每行两个正整数 pi, qi 表示答案。
为使输出统一,你应当保证 pi ≤ qi。
如果无解,请输出 'NO'。
样例 #1
样例输入 #1
10
770 77 5
633 1 211
545 1 499
683 3 227
858 3 257
723 37 13
572 26 11
867 17 17
829 3 263
528 4 109
样例输出 #1
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
提示
【样例 #2】
见附件中的 decode/decode2.in 与 decode/decode2.ans。
【样例 #3】
见附件中的 decode/decode3.in 与 decode/decode3.ans。
【样例 #4】
见附件中的 decode/decode4.in 与 decode/decode4.ans。
【数据范围】
以下记 m = n - e × d + 2。
保证对于 100% 的数据,1 ≤ k ≤ 105,对于任意的 1 ≤ i ≤ k,1 ≤ ni ≤ 1018,1 ≤ ei × di ≤ 1018 ,1 ≤ m ≤ 109。
| 测试点编号 | k ≤ | n ≤ | m ≤ | 特殊性质 |
| :----------: | :----------: | :----------: | :----------: | :----------: |
| 1 | 103 | 103 | 103 | 保证有解 |
| 2 | 103 | 103 | 103 | 无 |
| 3 | 103 | 109 | 6 × 104 | 保证有解 |
| 4 | 103 | 109 | 6 × 104 | 无 |
| 5 | 103 | 109 | 109 | 保证有解 |
| 6 | 103 | 109 | 109 | 无 |
| 7 | 105 | 1018 | 109 | 保证若有解则 p=q |
| 8 | 105 | 1018 | 109 | 保证有解 |
| 9 | 105 | 1018 | 109 | 无 |
| 10 | 105 | 1018 | 109 | 无 |
用C++内容:```cpp
#include
// 判断一个数是否为素数 bool isPrime(int n) { if (n <= 1) { return false; } for (int i = 2; i <= sqrt(n); ++i) { if (n % i == 0) { return false; } } return true; }
// 寻找p和q的值 pair<int, int> findPQ(int n, int e, int d) { int m = n - e * d + 2; if (m % 2 != 0) { return make_pair(-1, -1); } m /= 2; for (int i = 2; i <= sqrt(m); ++i) { if (m % i == 0 && isPrime(i)) { int p = i; int q = m / i; if (isPrime(q)) { return make_pair(p, q); } } } return make_pair(-1, -1); }
int main() { int k; cin >> k; vector<pair<int, int>> ans; for (int i = 0; i < k; ++i) { int n, e, d; cin >> n >> d >> e; pair<int, int> pq = findPQ(n, e, d); ans.push_back(pq); } for (int i = 0; i < k; ++i) { if (ans[i].first == -1) { cout << "NO" << endl; } else { cout << ans[i].first << " " << ans[i].second << endl; } } return 0; }
原文地址: https://www.cveoy.top/t/topic/qvVd 著作权归作者所有。请勿转载和采集!