复赛2:解密

洛谷: P8814

暴力破解:60分

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/**************************************************************** 
 * Description: 
 * Author: Alex Li
 * Date: 2023-09-18 12:18:10
 * LastEditTime: 2023-09-18 14:25:53
****************************************************************/
#include <iostream>
using namespace std;

int main(){
    int k;
    long long k,n,e,d,p,q;
    bool a;
    cin>>k;
    for (int i = 0; i <k; i++){
        a=true;
        cin>>n>>e>>d;
        for( p=1;p*p<=n;p++){
            if(n%p==0){
                q=n/p;
            if(e*d==(n-p-q+2)){
                cout<<p<<' '<<q;   
                a=false;            
                cout<<endl;
                break;
                }
       }
    }
     if(a)cout<<"NO"<<endl;
}
}

满分代码实现:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**************************************************************** 
 * Description: 
 * q*p=n
 * m=p+q=n-e*d+2
 * x^2-m*x+n=0  p和q是这个方程的解
 * Author: Alex Li
 * Date: 2023-09-18 12:18:10
 * LastEditTime: 2023-10-09 19:31:19
****************************************************************/
#include<iostream>
#include <cmath>

using namespace std;
int k;
long long  n,d,e,m,h,g;
int main(){
	cin>>k;
	while(k--){
		cin>>n>>d>>e;
		  m=n-d*e+2;  //m=q+p
		  g=m*m-4*n;
		  if(g<0){   //方程无解
		      	cout<<"NO\n";
			continue;
		  }
		  h=sqrt(g);   
		if(h*h!=g){  //h是整数,如果g不能完全平方,则'NO'
			cout<<"NO\n";
			continue;
		}
		if((m+h)%2==1||m<=h){  //如果不能被二整除,或是结果是负数,输出""NO"
			cout<<"NO\n";
			continue;
		}
		cout<<(m-h)/2<<' '<<(m+h)/2<<'\n';  //输出方程两个解
	}
	return 0;
} 

Scroll to Top