P8814

· · 个人记录

// 一元二次方程 
#include <bits/stdc++.h>
using namespace std;
int k;
int main()
{
    cin >> k;
    while (k--)
    {
        long long n,d,e,m,de;
        cin >> n >> d >> e;
        m=n+2-d*e;// m=q+p
        de=m*m-4*n;// b^2-4ac,delta
        if (de<0) cout << "NO\n";//delta<0 无解 
        else if (de==0) cout << m/2 << ' ' << m/2 << endl;// delta=0 则方程有两个相等的实数根 
        else// delta>0  则方程有两个不相等的实数根
        {
            long long p=(m-sqrt(de))/2;
            long long q=n/p;
            if (p>0 && // p为非正数 
            n==p*q && // 众所周知
            m=q+p) // 众所周知2
                cout << min(q,p) << ' ' << max(q,p) << endl;
            else cout << "NO\n"; //无解 
        }
    }
    return 0;
}
// 二分法 
#include <bits/stdc++.h>
using namespace std;
int k;
int main()
{
    cin >> k;
    while (k--)
    {
        long long n,e,d,m,mid,l=1,r;
        cin >> n >> e >> d;
        m=n-e*d+2;//m=q+p
        r=m/2;// 二分 
        while (l<r)
        {
            long long mid=(l+r)/2;//中间 
            if (mid*(m-mid)>=n) r=mid; //在左边 
            else l=mid+1; // 在右边 
        }
        //  ↓正数    ↓q*p==n 
        if (m-l>=1 && l*(m-l)==n) cout << l << ' ' << m-l << endl;
        else cout << "NO\n";// 无解 
    }
    return 0;
}
// 推公式
#include <bits/stdc++.h>
using namespace std;
int k;
int main()
{
    cin >> k;
    while (k--)
    {
        long long n,e,d,m,x,s;
        cin >> n >> e >> d;
        x=n-e*d+2;
        s=x*x-4*n;
        /*
            q+p=m
            (q+p)^2=q^2+2pq+p^2
            (q-p)^2=q^2-2pq+p^2
            之间差2pq-(-2pq)=4pq
            pq=n
            m^2-4n=(p-q)^2
            p-q=sqrt(m^2-4n)
            p+q+p-q=sqrt(m^2-4n)+m
            p=(sqrt(m^2-4n)+m)/2
        */
        m=sqrt(s);
        if (m*m==s)// s是完全平方数 
        {
            long long p=(m+x)/2;
            cout << min(p,x-p) << ' ' << max(p,x-p) << endl;
            continue;
        }
        cout << "NO\n";
    }
    return 0;
}
// 60分TLE
#include <iostream>
#include <cmath>
using namespace std;
int k;
int main()
{
    cin >> k;
    while (k--)
    {
        long long n,e,d,sum;
        bool f=1;
        cin >> n >> e >> d;
        sum=n-e*d+2;
        for (long long i=1 ; i*i<=n ; i++)
            if (i+n/i==sum && n%i==0)
//          if (i*(sum-i)==n)
            {
                f=0;
                cout << min(n/i,i) << " " << max(n/i,i) << endl;
//              cout << min(sum-i,i) << " " << max(sum-i,i) << endl;
                break;
            }
        if (f) cout << "NO\n";
    }
    return 0;
}