P8814
htgy194242666 · · 个人记录
// 一元二次方程
#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;
}