我的想法是这样的:
n=pq,n-ed+2=p+q=m
所以可以得到一个二元二次方程:
p+q=m(1),p*q=n(2)
(1)平方-4*(2)再开根号,得到p-q(3)
((1)+(3))/2就得到p,m-p就是q
考虑用的是整型变量再加个判断就搞定了
三次的代码如下
#include <bits/stdc++.h>
using namespace std;
unsigned long long k,n,d,e,p,q,m;
int main(){
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d%d%d",&n,&d,&e);
m=n-e*d+2;//m=p+q;
p=(m+sqrt(m*m-4*n))/2;
if(p*(m-p)==n) cout<<min(p,m-p)<<' '<<max(p,m-p)<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
unsigned long long k,n,d,e,p,q,a;
int main(){
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d%d%d",&n,&d,&e);
p=((n-e*d+2)+int(sqrt((n-e*d+2)*(n-e*d+2)-4*n)))/2;
q=n-e*d+2-p;
if(p*q==n){
if(p>q) swap(p,q);
printf("%d %d\n",p,q);
}
else printf("NO\n");
}
return 0;
}
#include <bits/stdc++.h>
using namespace std;
unsigned long long k,n,d,e,p,q,a;long double b;
int main(){
scanf("%d",&k);
for(int i=1;i<=k;i++){
scanf("%d%d%d",&n,&d,&e);
p=((n-e*d+2)+sqrt((n-e*d+2)*(n-e*d+2)-4*n))/2;
q=n/p;
a=sqrt((n-e*d+2)*(n-e*d+2)-4*n);
b=sqrt((n-e*d+2)*(n-e*d+2)-4*n);
if(a!=b){
printf("NO\n");
continue;
}
if(p+q==n-e*d+2){
if(p>q) swap(p,q);
printf("%d %d\n",p,q);
}
else printf("NO\n");
}
return 0;
}
然后都是六十分,两个subtask七八九十都WA
详情R169988876
考虑过溢出但我已经用了最大的unsigned long long了
求大佬调+瑞平qwq