复赛二:解密(decode)

洛谷: P8814
OJ: P4975

暴力破解: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. m = n - d * e + 2:这是根据题目给出的方程关系推导出的一个表达式。mpi + qi 的值。
  2. g = m * m - 4 * n:这是二次方程的判别式,用来判断方程是否有解。
  3. 如果 g < 0:表示方程没有实数解,因此输出 “NO”。
  4. h = sqrt(g):计算判别式的平方根。如果平方根不是整数,则无解。
  5. 检查 (m + h) % 2 == 1m <= h:确保方程有合适的整数解,并且 pi <= qi
  6. 最后输出符合条件的两个整数 piqi
 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
39
#include<iostream>
#include <cmath>

using namespace std;
int k; // 询问的次数
long long n, d, e, m, h, g; // n表示ni, d表示di, e表示ei,m表示q + p, h表示平方根的值,g是m的平方减去4n的值

int main() {
    cin >> k; // 输入询问的次数
    while (k--) { // 处理每一次询问
        cin >> n >> d >> e; // 输入ni, di, ei

        m = n - d * e + 2;  // 根据题目给出的关系式推导出 m = q + p
        g = m * m - 4 * n;  // 根据求解二次方程的判别式,g = m^2 - 4 * n

        if (g < 0) {  // 如果判别式 g 小于 0,说明方程无解
            cout << "NO\n"; // 输出 "NO"
            continue;
        }

        h = sqrt(g); // h 是判别式 g 的平方根

        if (h * h != g) {  // 如果 g 不能被完全平方,则说明 g 不是整数,也无解
            cout << "NO\n"; // 输出 "NO"
            continue;
        }

        // 如果 m + h 不能被 2 整除或者 m <= h,说明无法找到合适的 pi 和 qi
        if ((m + h) % 2 == 1 || m <= h) {
            cout << "NO\n"; // 输出 "NO"
            continue;
        }

        // 如果通过所有条件,输出 pi 和 qi,确保 pi <= qi
        cout << (m - h) / 2 << ' ' << (m + h) / 2 << '\n';
    }

    return 0;
}

Scroll to Top