20分求助
查看原帖
20分求助
638718
xueruo楼主2022/10/30 10:02

我这个是用解二次方程的出的,不知道为什么只A了前两个点

n=p*q

p+q=n-e*d+2

q^2-mq+n=0

q=(m+-sqrt(m^2-4*n))/2

#include<iostream>
#include<cmath>
using namespace std;
long long k,n,q,p,e,d;
int can(long long x){
	int s=floor(sqrt(x));
	if(s*s==x){
		return 1;
	}else{
		return 0;
	}
}
int main(){
	ios::sync_with_stdio(false),cin.tie(),cout.tie();
	cin>>k;
	while(k--){
	    cin>>n>>d>>e;
//不行的暴力60
//	    for(int i=1;i<=sqrt(n);i++){
//	        if(n%i==0){
//	            p=i;
//	            q=n/i;
//	            if(e*d==(n-p-q+2)){
//	                cout<<p<<" "<<q<<endl;
//	                flag=1;
//	                break;
//	            }
//	        }
//	    }
//二分
//	    long long flag=0,m=n-e*d+2,left=1,right=m/2;
//	    while(left<=right){
//		    long long mid=(left+right)/2;
//		    if(mid*(m-mid)==n){
//		   		cout<<mid<<" "<<m-mid<<endl;
//		   		flag=1;
//		    	break;
//			}else if(mid*(m-mid)<n){
//				left=mid+1;
//			}else{
//		   		right=mid-1;
//			}
//		}
		long long flag=0,m=n-e*d+2,derta=m*m-4*n;//pq=n  p+q=n-ed+2    q^2-mq+n=0
		if(derta<0){
			cout<<"NO\n";
			continue;
		}
		if(can(derta)){
//			cout<<m*m-4*n<<"can be sqrt\n";
			if((m*m-derta)%2==0){//p
				cout<<(m-sqrt(derta))/2<<" ";
				flag=1;
			}
			if((m*m+derta)%2==0){//q
				cout<<(m+sqrt(derta))/2<<endl;
				flag=1;
			}
		}
		if(!flag){
			cout<<"NO\n";
		}
	}
	return 0;
}
/*
in
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
out
2 385
NO
NO
NO
11 78
3 241
2 286
NO
NO
6 88
*/
2022/10/30 10:02
加载中...