4137: 解密 [CSP-J 2022]
内存限制:512 MB
时间限制:1.000 S
评测方式:文本比较
命题人:
提交:48
解决:3
题目描述
给定一个正整数 ,有 次询问,每次给定三个正整数 ,求两个正整数 ,使 、。
输入
第一行一个正整数 ,表示有 次询问。
接下来 行,第 行三个正整数 。
输出
输出 行,每行两个正整数 表示答案。
为使输出统一,你应当保证 。
如果无解,请输出 NO。
样例输入 复制
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
样例输出 复制
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
提示
【数据范围】
以下记 。
保证对于 的数据,,对于任意的 ,, ,。
#include<bits/stdc++.h>
using namespace std;
/*方法一:枚举法-时间复杂度-O(k*sqrt(n))*/
int main(){
int k;cin>>k;
long long n,d,e,q;
while(k--) {
scanf("%ld%ld%ld",&n,&d,&e);
bool flag=false;
for(long long p=1;p*p<=n;p++) {
if(n%p==0) {
q=n/p;
if(e*d==(p-1)*(q-1)+1) {
flag=true;
cout<<p<<" "<<q<<endl;
break;
}
}
}
if(!flag) cout<<"NO"<<endl;
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
/*方法二:数学求根法-时间复杂度-O(k)*/
/*
n=p*q
e*d=(p-1)*(q-1)+1
e*d=pq-p-q+2
p+q=n-e*d+2=m
n-e*d+2=m
p+q=m
p+n/p=m
p^2-mp+n=0
*/
int main(){
int k;cin>>k;
long long n,d,e,q;
while(k--) {
cin>>n>>d>>e;
long long m=n-e*d+2;
long long delta=m*m-4*n;
//无解
if(delta<0) cout<<"NO"<<endl;
//没有整数解
else if(sqrt(delta)!=int(sqrt(delta)))
cout<<"NO"<<endl;
//没有整数解
else if((m-int(sqrt(delta)))%2!=0)
cout<<"NO"<<endl;
else {
cout<<(m-int(sqrt(delta)))/2<<" "<<(m+int(sqrt(delta)))/2<<endl;
}
}
return 0;
}