题3:解密(decode)
【题目描述】
给定一个正整数 kkk,有 kkk 次询问,每次给定三个正整数 ni,ei,din_i, e_i, d_ini,ei,di,求两个正整数 pi,qip_i, q_ipi,qi,使 ni=pi×qin_i = p_i \times q_ini=pi×qi、ei×di=(pi−1)(qi−1)+1e_i \times d_i = (p_i - 1)(q_i - 1) + 1ei×di=(pi−1)(qi−1)+1。
【输入格式】
第一行一个正整数 kkk,表示有 kkk 次询问。
接下来 kkk 行,第 iii 行三个正整数 ni,di,ein_i, d_i, e_ini,di,ei。
【输出格式】
输出 kkk 行,每行两个正整数 pi,qip_i, q_ipi,qi 表示答案。
为使输出统一,你应当保证 pi≤qip_i \leq q_ipi≤qi。
如果无解,请输出 NO 。
【输入样例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
【数据规模与约定】
以下记 m=n−e×d+2m = n - e \times d + 2m=n−e×d+2。
保证对于 100%100\%100% 的数据,1≤k≤1051 \leq k \leq {10}^51≤k≤105,对于任意的 1≤i≤k1 \leq i \leq k1≤i≤k,1≤ni≤10181 \leq n_i \leq {10}^{18}1≤ni≤1018,1≤ei×di≤10181 \leq e_i \times d_i \leq {10}^{18}1≤ei×di≤1018
,1≤m≤1091 \leq m \leq {10}^91≤m≤109。
测试点编号 | k≤k \leqk≤ | n≤n \leqn≤ | m≤m \leqm≤ | 特殊性质 |
---|---|---|---|---|
111 | 10310^3103 | 10310^3103 | 10310^3103 | 保证有解 |
222 | 10310^3103 | 10310^3103 | 10310^3103 | 无 |
333 | 10310^3103 | 10910^9109 | 6×1046\times 10^46×104 | 保证有解 |
444 | 10310^3103 | 10910^9109 | 6×1046\times 10^46×104 | 无 |
555 | 10310^3103 | 10910^9109 | 10910^9109 | 保证有解 |
666 | 10310^3103 | 10910^9109 | 10910^9109 | 无 |
777 | 10510^5105 | 101810^{18}1018 | 10910^9109 | 保证若有解则 p=qp=qp=q |
888 | 10510^5105 | 101810^{18}1018 | 10910^9109 | 保证有解 |
999 | 10510^5105 | 101810^{18}1018 | 10910^9109 | 无 |
101010 | 10510^5105 | 101810^{18}1018 | 10910^9109 | 无 |
【代码如下】:
#include<bits/stdc++.h>
using namespace std;
int main(int argc, const char * argv[]) {
long long k;
scanf("%lld",&k);
while (k--) {
long long n,e,d;
scanf("%lld%lld%lld",&n,&e,&d);
long long PsubQ = sqrt((n - e * d + 2) * (n - e * d + 2) - (n * 4));
long long PaddQ = n - e * d + 2;
long long P = (PsubQ + PaddQ) / 2;
long long Q = PaddQ - P;
if (P * Q == n && e * d == (P - 1) * (Q - 1) + 1 && P && Q) {
printf("%lld %lld\n",min(P, Q),max(P, Q));
}else {
printf("NO\n");
}
}
return 0;
}