题面

CSP-J2022 T2 解密_#include

思路

思路一:暴力枚举(歪解)

时间复杂度 CSP-J2022 T2 解密_CSP_02 ,所以分数拿不全,CSP-J2022 T2 解密_ios_03 点超时。

CSP-J2022 T2 解密_#include_04

// Author: PanDaoxi
#include <bits/stdc++.h>
#define int long long
using namespace std;

int k, n, e, d, p, q;
bool flag;

signed main(){
ios :: sync_with_stdio(false);

cin >> k;
while(k--){
cin >> n >> e >> d;
flag = false;

for(int i=1; i<=n; i++){
if(n % i) continue;
p = i, q = n / i;

if(e*d == n - q - p + 2){
if(p > q) swap(p, q);
cout << p << " " << q << endl;
flag = true;
break;
}
}

if(!flag) cout << "NO" << endl;
}

return 0;
}

思路二:数学(正解)

知识:

  • 完全平方公式: CSP-J2022 T2 解密_#include_05
  • 简单的应用: CSP-J2022 T2 解密_c++_06

由题意我们可得 CSP-J2022 T2 解密_ios_07CSP-J2022 T2 解密_c++_08
我们令 CSP-J2022 T2 解密_CSP_09
利用完全平方公式,我们令 CSP-J2022 T2 解密_#include_10
无论 CSP-J2022 T2 解密_CSP_11CSP-J2022 T2 解密_c++_12 的大小关系如何,CSP-J2022 T2 解密_#include_13

根据二元一次方程组的加减消元法(即小学数学“和差问题”),我们可以得出 CSP-J2022 T2 解密_CSP_14CSP-J2022 T2 解密_ios_15 的具体数值。
CSP-J2022 T2 解密_c++_16 类型会自动把上文所述 CSP-J2022 T2 解密_#include_17 的值向下取整,那么如果开平方没有开尽,CSP-J2022 T2 解密_ios_18 自然不会与 CSP-J2022 T2 解密_c++_19 相等,即 CSP-J2022 T2 解密_#include_20说明这种情况无解

// Author: PanDaoxi
#include <bits/stdc++.h>
#define int long long
using namespace std;

int k, n, e, d, p, q, a, b;

signed main(){
ios :: sync_with_stdio(false);

cin >> k;
while(k--){
cin >> n >> e >> d;

a = n + 2 - e*d; // a = p + q
b = sqrt(a*a - 4*n); // b = p - q;
p = (a + b) / 2;
q = a - p;

if(p*q == n){ // 相乘得原数
if(p > q) swap(p, q);
cout << p << " " << q << endl;
}
else{
cout << "NO" << endl;
}
}

return 0;
}