[CSP-J 2022] 解密

蒟蒻思路的来源

这道题CCF还是放了很多水分在里面;首先看数据范围:

以下记 m = n − e × d + 2 m = n - e \times d + 2 m=ne×d+2

是不是很熟悉?是的,这题CCF贴心提示我们用韦达定理和求根公式;

思路分析

首先,对 e i × d i e_i \times d_i ei×di进行化简:
e i × d i = ( p i − 1 ) ( q i − 1 ) + 1 = p i × q i − ( p i + q i ) + 2 = n i − ( p i + q i ) + 2 e_i \times d_i =(p_i-1)(q_i-1)+1 \\ =p_i \times q_i -(p_i+q_i)+2 \\ =n_i-(p_i+q_i)+2 ei×di=(pi1)(qi1)+1=pi×qi(pi+qi)+2=ni(pi+qi)+2
因此,移项可得:
{ p i + q i = n i + 2 − e i × d i = − b a p i × q i = n i = c a \left\{\begin{matrix} p_i+q_i=n_i+2-e_i \times d_i =- \frac{b}{a} \\ p_i\times q_i= n_i=\frac{c}{a} \end{matrix}\right. {pi+qi=ni+2ei×di=abpi×qi=ni=ac
我们可以构造方程: a x 2 + b x + c = 0 ax^2+bx+c=0 ax2+bx+c=0

即: x 2 + ( e i × d i − n i − 2 ) x + n = 0 x^2+(e_i \times d_i-n_i-2)x + n=0 x2+(ei×dini2)x+n=0

根据求根公式,有: Δ = b 2 − 4 a c = ( e i × d i − n i − 2 ) 2 − 4 × 1 × n i = ( e i × d i − n i − 2 ) 2 − 4 × n i ( Δ ≥ 0 ) \Delta = b^2-4ac = (e_i \times d_i-n_i-2)^2-4 \times 1 \times n_i =(e_i \times d_i-n_i-2)^2 - 4 \times n_i (\Delta \ge 0) Δ=b24ac=(ei×dini2)24×1×ni=(ei×dini2)24×ni(Δ0)

所以,有:

q i / p i = − b ± b 2 − 4 a c 2 a = − ( e i × d i − n i − 2 ) ± ( e i × d i − n i − 2 ) 2 − 4 × n i 2 q_i / p_i={\small{-b \pm \sqrt{b^2-4ac}\over 2a}}= {\small \frac{-(e_i \times d_i-n_i-2) \pm \sqrt{(e_i \times d_i-n_i-2)^2 - 4 \times n_i} }{2}} qi/pi=2ab±b24ac =2(ei×dini2)±(ei×dini2)24×ni

最后输出即可;但是要注意 q i p i q_ip_i qipi均为整数!

AC Code

	#include
using namespace std;
long long k,n,e,d;
long long b,c,drt;
long long x,y;
int main(){
	scanf("%lld",&k);
	while(k--){
		scanf("%lld%lld%lld",&n,&e,&d);
		c=n;
		b=e*d-n-2;
		drt=b*b-c-c-c-c;
		if(drt<0){
			printf("NO\n");continue;
		}
		if(sqrt(drt)*sqrt(drt)!=drt){
			printf("NO\n");continue;
		}
		drt=sqrt(drt);
		if((-b+drt)%2==1){
			printf("NO\n");continue;
		}
		x=(-b+drt)/2;
		y=(-b-drt)/2;
		if(x<=0||y<=0){
			printf("NO\n");continue;
		}
		printf("%lld %lld\n",y,x);
	}
	return 0;
}

你可能感兴趣的:(CCF,c++,杂题,c++,csp初赛)