CSP-J2022 T2 解密

题面

思路

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

时间复杂度 O ( n 2 ) O(n^2) O(n2) ,所以分数拿不全, 6 6 6 点超时。
CSP-J2022 T2 解密_第1张图片

// Author: PanDaoxi
#include 
#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;
}

思路二:数学(正解)

知识:

  • 完全平方公式: ( a ± b ) 2 = a 2 + b 2 ± 2 a b . (a\pm b)^2=a^2+b^2\pm 2ab. (a±b)2=a2+b2±2ab.
  • 简单的应用: ( a + b ) 2 − 4 a b = ( a − b ) 2 . (a+b)^2-4ab=(a-b)^2. (a+b)24ab=(ab)2.

由题意我们可得 n = q p n=qp n=qp e d = ( q − 1 ) ( p − 1 ) + 1 = q p − q − p + 2 = n − q − p . ed=(q-1)(p-1)+1=qp-q-p+2=n-q-p. ed=(q1)(p1)+1=qpqp+2=nqp.
我们令 a = n + 2 − e d = q + p . a=n+2-ed=q+p. a=n+2ed=q+p.
利用完全平方公式,我们令 b = a 2 − 4 n = ( q − p ) 2 = q − p . b=\sqrt{a^2-4n}=\sqrt{(q-p)^2}=q-p. b=a24n =(qp)2 =qp.
无论 p p p q q q 的大小关系如何, ( q + p ) 2 , ( q − p ) 2 ≥ 0. (q+p)^2,(q-p)^2\ge0. (q+p)2,(qp)20.

根据二元一次方程组的加减消元法(即小学数学“和差问题”),我们可以得出 q q q p p p 的具体数值。
int (long long) \text{int (long long)} int (long long) 类型会自动把上文所述 b b b 的值向下取整,那么如果开平方没有开尽, q p qp qp 自然不会与 n n n 相等,即 ⌊ q p ⌋ ≠ n \lfloor qp\rfloor\ne n qp=n说明这种情况无解

// Author: PanDaoxi
#include 
#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;
}

你可能感兴趣的:(C++,c++,CSP)