P8814 [CSP-J 2022] 解密 题解

· · 题解

稍微爆拆一下,e_i\times d_i=p_i\times q_i-p_i-q_i+2

n_i 减掉这个,p_i+q_i=n-e_i\times d_i+2

哦对了为了方便记上面那坨为 m_i

然后和与积都有,直接构造二次方程(用韦达定理)。

x^2-m_i\times x+n_i=0

判别式上求根公式,x=\frac{m_i\pm \sqrt{m^2-4\times n_i}}{2}

然后判一下根号里面是不是完全平方、是否为正数和是否能被 2 整除即可。保证是否有解和解是否为正整数。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int k,n,d,e;
signed main(){
    ios::sync_with_stdio(0);
    cin>>k;
    while(k--){
        cin>>n>>d>>e;
        int m=n-d*e+2;
        int k=m*m-4*n;
        int kk=sqrt(k);
        if(kk*kk!=k){
            cout<<"NO\n";
            continue;
        }
        if((m+kk)%2==1||m<=kk){
            cout<<"NO\n";
            continue;
        }
        cout<<(m-kk)/2<<' '<<(m+kk)/2<<'\n';
    }
    return 0;
}