马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 player-none 于 2025-3-16 13:23 编辑
不好意思,最后发现是范围出了问题,int 改longlong p<=n改成p*p<=n就解决了
草烦死了题目里有不可见字符
题目描述
给定一个正整数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
输入
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
提示
以下记$m=n−e×d+2$。
保证对于100%的数据,1≤k≤10^5,对于任意的1≤i≤k,1≤ni​≤10^18,1≤ei​×di​≤10^18,1≤m≤10^9。
我的代码:#include<bits/stdc++.h>
using namespace std;
int main(){
int k;
cin>>k;
for(int i=0;i<k;i++){
int n,e,d;
cin>>n>>e>>d;
int ed=e*d;
bool solve=false;
for(int p=1;p<=n;p++){
if(n%p)continue;
int q=n/p;
if(n-p-q+2==ed){
cout<<p<<" "<<q<<"\n";
solve=true;
break;
}
}
if(!solve){
cout<<"NO\n";
}
}
return 0;
}
还是最后两空过不了
修改后:
#include<bits/stdc++.h>
using namespace std;
int main(){
int k;
cin>>k;
for(int i=0;i<k;i++){
long long n,e,d;
cin>>n>>e>>d;
long long ed=e*d;
bool solve=false;
for(long long p=1;p*p<=n;p++){
if(n%p)continue;
long long q=n/p;
if(n-p-q+2==ed){
cout<<p<<" "<<q<<"\n";
solve=true;
break;
}
}
if(!solve){
cout<<"NO\n";
}
}
return 0;
}
|